我目前正在使用带有ASP.NET Webforms的fineuploader,并且在FireFox中遇到严格模式问题。 ASP.NET Webforms具有一个包含以下代码的javascript文件(microsoftajaxwebforms.js)(该代码用于回发到服务器并调用传递的事件,例如下面的Save。):

_doPostBack: function(a, k) {
    var f = window.event;
    if (!f) {
        var d = arguments.callee ? arguments.callee.caller : null;
        if (d) {
            var j = 30;
            while (d.arguments.callee.caller && --j) d = d.arguments.callee.caller;
            f = j && d.arguments.length ? d.arguments[0] : null
        }
    }
    ...


该函数在我正在使用的代码库中广泛使用。我不能更改此代码,因为它会在产品的其余部分产生意外的副作用。问题出在arguments.callee.caller上。这就是引发错误access to strict mode caller function is censored的原因。我相信解决方案是从fineuploader.js中删除use strict,但是我担心这可能会影响其他浏览器中的fineuploader。我对javascript中的严格模式不熟悉,因此也许有人可以阐明从fineuploader.js中删除严格模式的可能的副作用。作为参考,这里是fineuploader函数,该函数最终调用上述代码并导致错误。

var fineUploader = $('#jquery-wrapped-fine-uploader').fineUploader({
    ...
    multiple: false,
    text: {
        uploadButton: 'Click or drag a file to upload.'
    },
    autoUpload: false,
    debug: false,
    template: 'fineuploader-template',
    ...
    }
}).bind('complete', function (event, id, name, response) {
    if (response['success']) {
        cp_hide();
        fineUploader.fineUploader('reset');
        __doPostBack("Save", "");
    }
})...


如果需要,我可以修改microsoftajaxwebforms.js引用的代码以外的任何内容。感谢您的帮助。

最佳答案

根据jQuery票证(http://bugs.jquery.com/ticket/13335)的解决方法是在客户端手动调用事件,而不是直接调用__doPostBack

$('#Save').trigger('click');


但是,如果您尝试从客户端事件中触发回发,则trigger选项将不起作用。相反,您可以使用丑陋但可靠的setTimeout退出strict模式。

$('#Save').on('click', function(e) {
  var result = doSomeStuff();
  if(result.success) {
    window.setTimeout(function() { __doPostBack('Save', '') }, 5);
  }
  // ...
});


jQuery最终于2年前删除了use strict,因此升级jQuery(如果可能)也应该可以解决该问题。

10-08 09:35