Safari Mobile(iPad)上的Javascript堆栈检查

时间:2011-03-18 23:59:29

标签: javascript ipad mobile-safari

我的代码如下:

function myEventHandler() {
    inMyEventHandler = true;
    longRunningStuff();
    inMyEventHandler = false;
}

这很好用,除了在iPad上,Safari Mobile偶尔会出错我的Javascript。所以longRunningStuff()死了,inMyEventHandler永远不会被清除。这非常糟糕,因为如果我们在这个函数之外,或者发生了Bad Things(tm),那么inMyEventHander 绝对不能

理想情况下,我可以从longRunningStuff中深入检查myEventHandler是否在调用堆栈中位于它之上,这样可以自行处理。我找不到办法做到这一点......提示?

3 个答案:

答案 0 :(得分:2)

  1. (最简单)您可以在arguments.callee.caller时检查longRunningStuff

    function longRunningStuff() {
      if (arguments.callee.caller === myEventHandler) {
        // take care
      }
    }
    
  2. 另一种变体:

    function myEventHandler() {
      // code
    }
    myEventHandler.disable_in_longRunningStuff = true;
    function longRunningStuff() {
      if (arguments.callee.caller.disable_in_longRunningStuff) {
        // take care
      }
    }
    
  3. 最长的方法 - 从https://github.com/eriwen/javascript-stacktrace

  4. 检索调用堆栈

答案 1 :(得分:1)

我多年来一直使用以下方法来手动检查callstack。我有一段时间没有更新它,从来没有在ipad或手机游戏中尝试过,所以无论它是否适合你,我都说不出来。

也许你可以用它来获取灵感:

function logStackTrace(levels) {
    var c = console;
    var callstack = [];
    var isCallstackPopulated = false;
    try {
        throw new Error();
    } catch (e) {
        if (e.stack) { //Firefox
            var lines = e.stack.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
                    callstack.push(lines[i]);
                }
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
        else if (window.opera && e.message) { //Opera
            var lines = e.message.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
                    var entry = lines[i];
                    //Append next line also since it has the file info
                    if (lines[i + 1]) {
                        entry += " at " + lines[i + 1];
                        i++;
                    }
                    callstack.push(entry);
                }
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
    }
    if (!isCallstackPopulated) { //IE and Safari
        var currentFunction = arguments.callee.caller;
        while (currentFunction) {
            var fn = currentFunction.toString();
            var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
            callstack.push(fname);
            currentFunction = currentFunction.caller;
        }
    }
    if (levels) {
        c.log(callstack.slice(0, levels).join('\n'));
    }
    else {
        c.log(callstack.join('\n'));
    }
};

答案 2 :(得分:0)

从iOS 6开始,我们可以使用真正的网络检查员。见下文或此链接。 https://stackoverflow.com/a/12762449/72428

更新!!! 在OS X上,您可以在iOS模拟器和iOS 6设备上使用Safari Web检查器。

  1. 首先在Safari中启用Developer菜单。
  2. 接下来,在iOS设备(或模拟器)上启用远程调试。

    Settings > Safari > Advanced > Web Inspector (ON)
    
  3. 在您的设备上返回Safari。
  4. 返回计算机,单击“开发人员”菜单,然后选择您的 设备(例如iPhone模拟器,iPhone)
  5. 注意:只有当Safari处于活动状态且正在运行时,您才会在“开发人员”菜单中看到您的设备。

    享受!