在Safari中,使用jQuery后,表单输入文本字段在显示警报后不会获得焦点。为什么?

时间:2010-05-13 14:21:14

标签: javascript jquery focus

我有一个ASPX网页表单。我使用jQuery来简化我的Javascript。我使用Javascript验证脚本来验证每个表单字段的值。如果发生错误,我会弹出一条带有错误消息的警报。然后我将焦点转移到底层元素。

以下是我尝试过的例子。

使用jQuery:

var Form_FieldDef = function(name) {
    this.name = name;
    this.SetFocus = function() {
        $('#' + this.name)[0].focus();
    }
    this.Validate = function() {
        var isvalid = true;
        if ( $.trim($('#' + this.name).val()) == '') {
            alert("Your entry is empty");
            this.SetFocus();
            isvalid = false;
        }
        return isvalid;
    }
}

适用于IE7,IE8,Opera,Chrome和Firefox。它不适用于PC上的Safari 4。我没有Mac。

所以我将SetFocus方法改为此。

this.SetFocus = function() {
    var fld = document.getElementById(this.name);
    if (fld != null)
        fld.focus();
}

适用于IE7,IE8,Opera,Chrome和Firefox。它在PC上的Safari 4上不起作用。

我使用VS 2008调试器逐步完成代码,并且我在底层元素上调用焦点方法。

2 个答案:

答案 0 :(得分:0)

这是预感:尝试在超时例程中更改焦点:

this.setFocus = function() {
  var self = this;
  setTimeout(function() {
    $(self).focus();
  }, 1);
};

答案 1 :(得分:0)

我自己的预感:你可能在匿名函数中使用'this'引用它内部出现的任何匿名函数,使得'this'的使用模糊不清。也许这种轻微的修改会表现得不同(未经测试):

var Form_FieldDef = function(name) {
    var parentRef = this;
    this.name = name;
    this.Validate = function() {
        var isvalid = true;
        var elem = $('#' + parentRef.name);
        if ($.trim(elem.val()) == '') {
            alert("Your entry is empty");
            elem.focus();
            isvalid = false;
        }
        return isvalid;
    }
}