2011-12-30 34 views
7

我刚刚遇到了this sample code,它具有包含外部源和身体的脚本标记。我认为这是一种巧妙的方式将一些信息传递给包含的脚本。 它是如何工作的?带有外部源和身体的脚本标记

<html> 
    <head> 
    <script src="http://unhosted.org/remoteStorage.js">{ 
     onChange: function(key, oldValue, newValue) { 
     if(key=='text') { 
      document.getElementById('textfield').value= newValue; 
     } 
     }, 
     category: 'documents' 
    }</script> 
    </head> 
+0

我不认为这是如何工作的问题,而不是这是否会影响代码的执行。 – Purag 2011-12-30 04:16:49

回答

6

标签中包含的脚本在正常情况下不会被评估。我认为在你的例子中发生的是remoteStorage.js正在读取内容本身,因为它被评估。像这样

//grab the last script tag in the DOM 
//this will always be the one that is currently evaluating during load 
var tags = document.getElementsByTagName('script'); 
var tag = tags[tags.length -1]; 
//force evaluation of the contents 
eval(tag.innerHTML); 

虽然这看起来整洁的标记,我,我只想用一个单独的脚本标记,避免这种强迫的评价。

2

它不应该工作。 html specs指出,如果脚本标记上有src属性,则应忽略<script></script>的内容,只应执行src位置上的代码。

另一方面,在理解javascript的浏览器上,它会优雅地降级,但不够新以支持外部JS代码。如果有这样的浏览器存在,谁知道,但一般来说,片段中的onchange代码不应该由任何像样的现代浏览器执行。

+0

如果你说的是真的,这段代码根本没有意义。我以某种方式怀疑这一点。 – Thilo 2011-12-30 05:05:48

+0

他们甚至有明确的指示写下脚本标签,如下所示:“在元素内部,指定'onChange'和'category',如下所示” – Thilo 2011-12-30 05:08:51

+0

根据规范确实如此。不幸的是,有太多糟糕的浏览器(* koff * microsoft * koff *)把规格视为笑话并做自己的事情。 – 2011-12-30 12:44:26

3

尽管浏览器在具有src属性时被认为忽略script元素的内容,但这只是表示它们不以正常方式处理它(解析并作为JavaScript代码运行)。内容仍然存储在DOM中,并可以通过脚本读取。内容可以是任何东西然后,不一定是JavaScript代码,但任何数据。