我对OnBlur事件处理程序有一些输入,比如
<input name="abc" tabIndex="5" class="datetime" onblur="if (CheckMode(this))__doPostBack('abc',''); else return false;" />
在JQuery Form准备就绪中,我想将OnBlur事件hanlder转换为类似
的内容 <input name="abc" tabIndex="5" class="datetime" onblur="....; setTimeout(function(){if (CheckMode(this))__doPostBack('abc',''); else return false;},100);" />
这意味着我想用一些额外的代码包装当前的事件处理程序。
在做了一些额外的工作之后,我想用setTimeOut()调用旧代码。
如果可以在客户端进行,如上所述?
我试过attr(),但它不起作用。
内容发生了变化,但是没有任何事情发生在.Blur
另外,我想,在这种情况下我不能使用Blur()/ Live()/ bind(),可以吗?
答案 0 :(得分:1)
你所拥有的东西叫做DOM0处理程序 - 一个处理程序,它使用一种机制,它不是由任何DOM标准定义的,但是所有主流浏览器都支持它。
在您的特定示例中,您可以使用附加现代或“DOM2”处理程序的jQuery附加您自己的blur
处理程序,该处理程序不会取代DOM0处理程序,因为您要做的就是添加一个setTimeout
致电。如果你想做其他任何事情,你必须做一些更复杂的事情,因为有些浏览器在调用DOM2处理程序之前调用DOM0处理程序,而其他浏览器在调用DOM0处理程序之前调用DOM2处理程序。但同样,因为你所做的是触发异步(通过setTimeout
),这没关系,你不关心哪个被调用,因为你的超时代码无论如何都不会运行。< / p>
但我们假设你想做一些更有趣的事情:
您可以使用现代DOM2替换DOM0处理程序。您只需从DOM元素的反射属性中获取DOM0处理程序,替换自己的处理程序,然后从处理程序中调用DOM0函数。您希望确保在它期望的上下文中调用DOM0处理程序,并使用它期望的参数。像这样的东西(这个例子使用click
而不是blur
,但在两种情况下都应该相同):
var target, dom0handler;
// Use jQuery to find the element
target = $("#target");
// Did we find it?
if (target[0]) {
// Yes, get the DOM0 handler from the DOM element itself (not the jQuery object)
dom0handler = target[0].onclick;
// Get rid of it
target[0].onclick = "";
// Hook up our own handler
target.click(function(event) {
display("Before calling DOM0 handler");
if (typeof dom0handler === "function") {
if (dom0handler.call(this, event) === false) {
event.preventDefault();
}
}
display("After calling DOM0 handler");
});
}
注意不对称性:我们读取onclick
属性并获取一个函数,但我们为其分配了一个字符串。将空白字符串分配给onclick
是清除处理程序的最广泛兼容方式(分配null
或undefined
在某些浏览器中不起作用)。 (好吧,好吧,另一种方式是target[0].onclick = function() { }
,但为什么在你不需要的时候创建一个函数。)
<强>更新强>:
从下面的评论中,您已经说过要在超时后调用DOM0处理程序。只需将代码包装在闭包中调用它(并处理this
问题),就可以轻松地做到这一点:
var target,
dom0handler,
activeTimeout = 0; // Use 0 for "none" because 0 is not a valid return from `setTimeout`
// Use jQuery to find the element
target = $("#target");
// Did we find it?
if (target[0]) {
// Yes, get the DOM0 handler from the DOM element itself (not the jQuery object)
dom0handler = target[0].onclick;
// Get rid of it
target[0].onclick = "";
// Hook up our own handler
target.click(function(event) {
var element = this; // Remember the element to a local, because `this` will have a different value inside the function called by `setTimeout`
// If we have a function to call and we're not busy...
if (activeTimeout === 0 && typeof dom0handler === "function") {
// ...call it
activeTimeout = setTimeout(function() {
activeTimeout = 0; // Clear this since the timeout has occurred
dom0handler.call(element, event); // Call the handler; we no longer care about its return value
}, 100);
}
return false;
});
}
在发生之前取消它:
if (activeTimeout !== 0) {
clearTimeout(activeTimeout);
activeTimeout = 0;
}
答案 1 :(得分:0)
你能否使用.blur()?
将blur事件绑定到元素E.g。
$("#mytextbox").blur(function() {
alert("lost focus");
});
答案 2 :(得分:0)
您的意见:
<input id="abc" name="abc" type="text" tabIndex="5" class="datetime" onblur="if (CheckMode(this))__doPostBack('abc',''); else return false;" onkeyup="yourfunction(this.value);" autocomplete="off">
你的剧本:
function yourfunction(abc){
$("input").blur(function(){
var element =$(this);
var I = element.attr("value");
if (I !== 'abc'){element.val('abc');}
});
if(abc.length==0){
//if length is null do some stuff...
}
//do some more stuff here !!
}
请注意:onkeyup="yourfunction(this.value);"