我有C ++的背景,但对我在Javascript中尝试做的事情有一些疑问。我需要创建一个伪类,因为Javascript没有它们。我基本上想根据选择的选项打印不同的东西。在这个例子中我只定义了两个“水果”,但我要做的事情会使用更多。任何帮助将不胜感激。我知道这里存在一些缺陷,就像select没有以任何方式链接到fruit函数一样。
<!DOCTYPE html>
<html>
<script>
function select_fruit(name)
{
var fruit_name = name;
}
function fruit(name, color, amt)
{
this.name = name;
this.color = color;
this.amt = amt;
}
apple = new fruit("apple", "red", 5);
orange = new fruit("orange", "orange", 1);
document.getElementById("name").innerHTML = name;
document.getElementById("color").innerHTML = color;
document.getElementById("amt").innerHTML = amt;
</script>
<body>
<select name="pick_these" onchange="fruit(this.value)">
<option value="apple">Apple</option>
<option value="orange">Orange</option>
</select><br />
<p>I want *amt *color *fruit</p><!--This should say I want 5 red apple, if it's selected on the dropdown-->
</body>
</html>
答案 0 :(得分:2)
首先,您缺少<head>
标记。除此之外,您需要将document.getElementById.....
行移至select_fruit()
函数,并将onchange
事件更改为调用select_fruit
。以下是我如何做你正在尝试的事情:
HTML:
<select id="fruitlist">
<option value="apple">Apple</option>
<option value="orange">Orange</option>
</select>
<p id="result"></p>
JS:
window.onload = function() { // or just `(function() {` if script is after above HTML
var fruits = {
"apple":{
"color":"red",
"amt":5
},
"orange":{
"color":"orange",
"amt":1
}
}, result = document.getElementById('result');
document.getElementById('fruitlist').onchange = function() {
var selection = this.options[this.selectedIndex].value;
result.innerHTML = "I want "+fruits[selection].amt+" "
+fruits[selection].color+" "+selection;
};
}; // or `})();` if you used `(function() {` at the start
答案 1 :(得分:0)
我将继续并同意cdhowie关于125%的评论 试图使用像Java / C#/ C ++ / ActionScript /等JS这样的工作 一旦你破解了一段时间,你就能够做出一些有用的东西,它会做一些功能性的东西。
但这确实不是应该使用语言的方式 如果你对其他语言有技术上的了解,那么Crockford的“JavaScript:the Good Parts”是一个很好的方式来实现。 如果您对语言的解析方式有限/不了解,或者您真的感觉迷失在JavaScript中,那么与您的舒适区相比,那么Crockford的书就像是一个训练营,适合那些希望有一个坚实的起点来抓住语言,在低级别(使用语言原样,没有库和最少使用设计模式)。
我想说Stoyan Stefanov的“JavaScript模式”是一个非常棒的下一步,因为它完全符合它在标签上的说法,并且它做得很好。
无论如何,你在这里遇到了很多问题。
首先,你的脚本在它们存在之前就要求元素及其值 JS / DOM没有预编译。 在大多数情况下,直到你进入客户端/服务器通信,或者你正在定义函数并在其他地方使用它们,你看到的就是你得到的,按照你放下的顺序。
在这种情况下,您要求的元素为el.id === "name"
如果你在代码中看到这一行的上方,你会注意到它上面没有任何元素id
。
此处的解决方案是确保您的脚本低于预期目标(或将所有内容包装在函数中,并调用<select>
下面的函数,以便您知道它存在)。
这引出了第二个问题:你的元素没有ID。
如果你没有ID,那么按ID获取这些元素是行不通的。
<select id="my-select-box"></select>
<script>
var select = document.getElementById("my-select-box");
</script>
如果你把它们放在另一边,它将无法工作
如果您缺少.id
属性,则无法使用。
对于“类”,不要将其视为定义硬类然后创建实例 有时,这是有用的/必要的 其他时候,您需要关心的只是实例。
我的意思是:在C ++中,想想你可能一直想要创建一个完整的类的所有时间,当一个简单的结构可能已经完成时。
那么你真正需要的只是单个实例的结构怎么样?
现在想象一下这个struct方法,而不需要做任何其他的工作(标题等)。
<select id="fruit-list">
<option value="apples">apple</option>
<option value="oranges">orange</option>
<option value="bananas">banana</options>
</select>
<p id="fruit-output"></p>
var Fruit = function (name, colour, starting_amount) {
var public_interface = {
name : name,
colour : colour,
amount : starting_amount
};
return public_interface;
};
var apples = Fruit("apple", "red", 4),
oranges = Fruit("orange", "orange", 2),
bananas = Fruit("banana", "yellow", 1);
var fruit_basket = {
selected : "",
output_el : null,
apples : apples,
oranges : oranges,
bananas : bananas,
add : function (fruit, num) {
this[fruit].amount += num;
},
remove : function (fruit, num) {
this[fruit].amount -= num;
},
print : function () {
var fruit = fruit_basket.selected,
el = fruit_basket.output_el,
message = "I want " + fruit.amount
+ " " + fruit.colour
+ " " + fruit.name;
if (fruit.amount !== 1) { message += "s" }
if (el.hasOwnProperty("textContent")) {
el.textContent = message;
} else {
el.innerHTML = message;
}
},
select : function (el) {
var index = el.selectedIndex,
fruit = el.options[index].value;
fruit_basket.selected = fruit_basket[fruit];
},
set_output : function (el) {
fruit_basket.output_el = el;
}
};
var select_box = document.getElementById("fruit-list"),
output_el = document.getElementById("fruit-output");
fruit_basket.set_output(output_el);
select_box.addEventListener("change", function () {
fruit_basket.select(this);
fruit_basket.print();
});
这不是 的答案,但请考虑这比C ++或Java解决方案更直接,在这里你必须为所有的人构建类以上。
如果这更高级,也许您会考虑以更明显分离的方式将您的数据与您的视图和控件分开。
但同样,这并不意味着你需要巨大的继承层次结构,或许多相对较少的类 它是一种非常简单的语言,支持构造/初始化,但您也可以通过现场发明一个对象来制作“单例”。
如果您打算认真使用该语言,我建议将该研究纳入其中。