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);
我改了行
功能的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) {
...
}
感谢您的回复。在视图的各种加载阶段中,有几个机会来运行JavaScript,这些阶段包含页面和页面本身(提供了诸如viewWillLoad,webViewDidAppear,webViewDidStartLoad等的回调)。我已经尝试了我的原始代码,您的代码和一些新代码,我已经在每个阶段添加了上面的更新,但没有运气。 – Gruntcakes 2012-02-19 00:48:47
@Wofofbeans - 你能检查任何javascript错误吗?你能够在代码中设置一个断点并通过它来追踪发生了什么?对于更高级的调试来说,这可能是一种实际发生的事情,而不仅仅是尝试。 – jfriend00 2012-02-19 00:54:24
它不可能afaik设置断点,有什么我可以使用警报来显示相关信息吗? – Gruntcakes 2012-02-19 01:14:50
当你说“分开载入”时,你是什么意思?你是否在DOM加载后手动加载它?如果是这样,那么'DOMContentLoaded'事件可能已经被触发,所以你的处理程序永远不会被调用。 – jfriend00 2012-02-18 22:59:31
我正在使用名为stringByEvaluatingJavaScriptFromString的iOS函数来执行脚本。我试过在页面加载前后执行它。 – Gruntcakes 2012-02-18 23:42:23