当Internet Explorer 8上的JavaScript发生异常时,我需要获得完整的调用堆栈.函数调用可能发生在数量很大的帧之间.
调用堆栈以将日志发送给开发人员.我不能使用调试器,因为最终用户不必处理这个问题.
JavaScripts的当前解决方案提供了它可以生成callstack(http://eriwen.com/javascript/js-stack-trace/).它基于arguments.callee.caller.但是如果从当前帧外部调用函数,则调用者返回零(未定义).因此获得的callstack是不完整的.
在这种情况下,我可以获取从中调用函数的框架的名称吗?
基于活动脚本技术的解决方案提供了ScriptEngine类型的对象:IHTMLDocument :: get_Script(IDispatch**p)
但是将对象"script"转换为IActiveScript接口失败.
*我可以从IE8中获取用于给定上下文ScriptEngine的链接,以提取构建callstack所需的信息吗?
javascript internet-explorer exception-handling javascript-engine
假设script脚本运行时文档中的最后一个元素*是当前运行的脚本是否安全?
例如,我想创建一个脚本,可以将其放在页面正文的任何位置,并在同一个地方显示一个元素.我正在做这样的事情:
function getCurrentScriptElement() {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length - 1];
}
var script = getCurrentScriptElement();
var view = document.createElement('span');
/* Put stuff in our view... */
script.parentNode.insertBefore(view, script);
Run Code Online (Sandbox Code Playgroud)
假设脚本在文档正文中,这是"安全吗?" 该getCurrentScriptElement函数是否总是返回正在运行的脚本?如果没有,怎么办呢?
我想这样做而不将脚本绑定到特定的id属性或类似属性,我希望它只是位置.
我在这里创建了一个示例来拉入此脚本.一个答案表明,其他脚本可能会创建一个像这样的例子会破坏的情况.是否可以在此示例中添加其他脚本来破坏它?
有人建议其他带有defer或async属性的脚本可能会破坏这一点.任何人都可以举例说明这样的脚本是如何工作的吗?
据我了解,defer意味着首先加载DOM,然后使用defer标记运行脚本.defer出现在另一个脚本元素上的属性如何影响getCurrentScriptElement?的行为?
async,据我所知,意味着开始获取该脚本并同时保持解析DOM,不要等待......但是当它到达我的脚本时它应该仍然停止并等待,对吧?
我不知道任何一个人如何影响它,任何人都能提供一个例子吗?
*出于此问题的目的,我只对外部脚本感兴趣.
**不是script整个文档中的最后一个script元素,而是运行时文档中的最后一个元素.该文档的其余部分尚未加载,对吧?