当我在没有setter方法的情况下分配值时,浏览器可以刷新输入元素(或任何其他元素),但只能通过正常赋值:
<script type="text/javascript">
document.getElementById("element_id").value = 'value';
</script>
是否存在本机事件,或者这是一个Javascript事件?我希望有类似的东西:
function setAttribute(value) {
model.value = ...
fireEvent();
}
但我也可以在没有setter的情况下设置属性。
那么这个“事件”在哪里被触发(隐藏在赋值中的'='),以便浏览器知道需要刷新?
问候
答案 0 :(得分:1)
JS引擎可以随意检测到它。它可能是一个简单的if(dest instanceof DOMElement){特殊处理},或者它可能是一个非常复杂的过程。这只是JS领域的一个简单任务。在实施土地中,只要最终效果正确,它就可以做任何想做的事情。
换句话说,它看起来像一个简单的任务。在幕后,它肯定更多。
答案 1 :(得分:0)
在Javascript中,您可以拥有custom getters and setters对象属性:
var obj = {
get prop () { alert("Getting prop!"); return 4; }
set prop (newValue) { alert("Setting prop to " + newValue); }
}
obj.prop = obj.prop + 1;
所以在这里,最后一行触发两个警报。
答案 2 :(得分:0)
就像Corbin说的那样,浏览器的实际JS / DOM实现可以做任何想做的事情。 Javascript是 text ,它被解释(或编译)成在虚拟机中运行的东西。文本的含义,以及它在解释时的效果 - 取决于解释器。
这是迟到和愚蠢的时间,所以要演示一个非常糟糕的“解析器/解释器”在 javascript中编写 ...它只允许一种语句和没有语法检查(或其他任何东西)。但谁知道 - 当浏览器解释实际脚本时,它仍然可以给出(非常简化)的概念:
var myscript1 = "value = 3";
var myscript2 = "othervalue = 5";
var variables = {};
// Hey ho, let's run our two "scripts":
parser(myscript1);
parser(myscript2);
function parser(script)
{
// Super-simple lexer:
var tokens = script.split(" ");
// Rudimentary error checking:
if (tokens.length != 3 || tokens[1] != "=")
{
alert("syntax error!");
}
var variable = tokens[0];
var value = parseInt(tokens[2], 10);
// Execute our only allowed operation:
setVariable(variable, value);
}
function setVariable(name, value)
{
// Store our value (e.g. for later use in our script - if our interpreter
// actually allowed doing anything except assigning values to variables:
variables[name] = value;
// ... and do something with it:
alert(name + " was set to " + value + "!");
}
我们的“语言”没有函数调用或事件,但我们的“解释器”可以使用给定的“脚本”做任何想做的事情。正如Corbin所说,它看似简单的分配,但在幕后(在setVariable
函数中),它肯定更多(好吧,在这种情况下,更多一点 - 触发警报)。