JavaScript代码中的HTML包含但不是在加载/单独

问题描述:

注入我有嵌入在加载的HTML页面中时,下面的代码工作顺利工作时:JavaScript代码中的HTML包含但不是在加载/单独

<HEAD> 
<script language="javascript" type="text/javascript"> 
document.addEventListener('DOMContentLoaded', function() 
{ 
    document.documentElement.addEventListener("touchstart", function (e) 
    { 
      if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1) 
      { 
       e.preventDefault(); 
       e.stopPropagation(); 
       invokeObjectiveC("ontouchstart:"); 
      } 
      else 
      { 
       e.preventDefault(); 
       e.stopPropagation(); 
       invokeObjectiveC(e.target); 
      } 
    }, true); 
}, false); 


function invokeObjectiveC(action) { 
    ... 
} 

但是如果我把它在html之外并且尝试分开地加载它然后它不工作。 当单独加载它,它看起来是这样的:

alert('test'); 

function addListener() 
{ 
    alert('adding listener'); 

    document.addEventListener('DOMContentLoaded', function() 
      { 
      document.documentElement.addEventListener("touchstart", function (e) 
         { 
         alert('touchstart'); 
         if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1) 
         { 
         e.preventDefault(); 
         e.stopPropagation(); 
         invokeObjectiveC("ontouchstart:"); 
         } 
         else 
         { 
         e.preventDefault(); 
         e.stopPropagation(); 
         invokeObjectiveC(e.target); 
         } 
         }, true); 
      }, false); 


} 

addListener(); 


function invokeObjectiveC(action) { 
    ... 
} 

添加的情况下,“测试”和“添加监听器”的警告对话框显示,所以我知道这部分工作。 但是,代码不起作用 - 它应该在屏幕的某些部分检测触摸(这是在iOS上)。 随着HTML内的代码一切正常,它会在屏幕被触摸时执行,当它被单独加载时,屏幕被触摸时什么都不会发生。 任何想法可能是什么问题?

====== UPDATE 我试图运行在生命周期的不同阶段以下,其中甚至载荷已经发出寻呼请求之前,但“大教堂加载内容”永远不会出现:

var script = document.createElement('script'); 
script.type = 'text/javascript'; 
script.text = 
var Test = 
{ 
f: function() 
    { 
     if (!event.originalTarget.defaultView.frameElement) 
     { 
      alert('DOM content loaded'); 
     } 
    } 
} 

function addTestListener() 
{ 
    alert('adding listener'); 
    window.addEventListener("DOMContentLoaded", function(e) { Test.f(); }, false); 
} 



document.getElementsByTagName('head')[0].appendChild(script); 
+0

当你说“分开载入”时,你是什么意思?你是否在DOM加载后手动加载它?如果是这样,那么'DOMContentLoaded'事件可能已经被触发,所以你的处理程序永远不会被调用。 – jfriend00 2012-02-18 22:59:31

+0

我正在使用名为stringByEvaluatingJavaScriptFromString的iOS函数来执行脚本。我试过在页面加载前后执行它。 – Gruntcakes 2012-02-18 23:42:23

我改了行

功能的addListener()

窗口:您可以通过检查,看看是否该文件已经被更改代码这个加载修复.onload = function addListener()

它似乎已经伎俩

从您对iOS功能的评论中,我怀疑当您尝试执行您的JavaScript时文档已经加载。如果是这样,那么DOMContentLoaded事件已经发生,所以你的代码将永远不会被初始化。

function addListener() { 
    alert('adding listener'); 

    function init() { 
     document.documentElement.addEventListener("touchstart", function (e) { 
      alert('touchstart'); 
      if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1) { 
       e.preventDefault(); 
       e.stopPropagation(); 
       invokeObjectiveC("ims-ontouchstart:"); 
      } else { 
       e.preventDefault(); 
       e.stopPropagation(); 
       invokeObjectiveC(e.target); 
      } 
     }, true); 
    } 

    if (document.readyState === "complete") { 
     init(); 
    } else { 
     document.addEventListener('DOMContentLoaded', init, false); 
    } 
} 

addListener(); 

function invokeObjectiveC(action) { 
    ... 
} 
+0

感谢您的回复。在视图的各种加载阶段中,有几个机会来运行JavaScript,这些阶段包含页面和页面本身(提供了诸如viewWillLoad,webViewDidAppear,webViewDidStartLoad等的回调)。我已经尝试了我的原始代码,您的代码和一些新代码,我已经在每个阶段添加了上面的更新,但没有运气。 – Gruntcakes 2012-02-19 00:48:47

+0

@Wofofbeans - 你能检查任何javascript错误吗?你能够在代码中设置一个断点并通过它来追踪发生了什么?对于更高级的调试来说,这可能是一种实际发生的事情,而不仅仅是尝试。 – jfriend00 2012-02-19 00:54:24

+0

它不可能afaik设置断点,有什么我可以使用警报来显示相关信息吗? – Gruntcakes 2012-02-19 01:14:50