0

How is it possible, that the browser can refresh the input element (or any other element), when I assign the value without a setter method, but just by normal assignment:

<script type="text/javascript">
  document.getElementById("element_id").value = 'value';
</script>

Is there a native event, or is this a Javascript event? I would expect something like:

function setAttribute(value) {
  model.value = ...
  fireEvent();
}

But I can also set the attribute only without setter.

So where is this "event" fired (hidden somewhere in the assignment with '=') so that the browser knows that a refresh is needed?

Greetings

4

3 回答 3

1

JS 引擎可以随意检测它。它可能是一个简单的 if (dest instanceof DOMElement) { special handling },也可能是一个极其复杂的过程。这只是 JS 领域的一个简单任务。在实现领域,只要最终效果正确,它就可以为所欲为。

换句话说,它看起来就像一个简单的任务。在幕后,它肯定更多。

于 2013-07-15T21:03:43.380 回答
0

正如 Corbin 所说,浏览器的实际 JS/DOM 实现可以为所欲为。Javascript 是被解释(或编译)成在虚拟机中运行的东西的文本。文本的含义以及解释时产生的影响取决于解释者。

现在已经很晚了,所以要演示一下,用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函数中),它肯定更多(好吧,在这种情况下,更多一点 - 触发警报)。

于 2013-07-15T21:27:10.600 回答
0

在 Javascript 中,您可以为对象属性自定义 getter 和 setter :

var obj = {
  get prop () { alert("Getting prop!"); return 4; }
  set prop (newValue) { alert("Setting prop to " + newValue); }
}

obj.prop = obj.prop + 1;

所以在这里,最后一行触发了两个警报。

于 2013-07-15T21:00:23.927 回答