yzzccc
2009-10-23 13:18 阅读 329

关于JavaScript中onpropertychange事件的问题

IE6里这事件不触发,具体代码(html页面源代码)如下:




测试
请注意第一次录入数据,不论什么方式(键盘输入,键盘粘贴,鼠标粘贴)都不会改变,第二次就可以,
这个问题是出现在使用DOM创建的input,并为input赋值,在页面里写的input没有这个问题



window.onload = function(){ var body = window.document.body; var txt = document.createElement("input"); txt.id = "txt"; txt.type = "text"; txt.value = "a"; //只要在这里赋值,第一次value改变事件监听就不会触发 if(/msie/i.test(navigator.userAgent)){ txt.attachEvent("onpropertychange",handle); } else { txt.addEventListener("input",handle,false); }; body.appendChild(txt); } //当状态改变的时候执行的函数 function handle() { //alert('输入的文字为:'+document.getElementById('txt').value); document.getElementById('msg').innerHTML='输入的文字为:'+document.getElementById('txt').value; }

[b]问题补充:[/b]
也不用需要它监听js修改值, 只要我用JS 将value设置好, onproperty事件可以监听页面上用户操作的事件就行,现在连这个都出问题了
[b]问题补充:[/b]
wilow你的解决方法试了么? 我这已经试过了,同样不行。就是第一次监听不到的问题;另外,IE的onpropertychange事件是可以监听js修改的。
[b]问题补充:[/b]
既然只是改值, 为什么不用onchange, 非用onpropertychange?

使用onpropertychange是需要进行联动计算事件监听
比如:
一个表格有三列, 第三列的值从第一二列算出。
那么,当操作人修改其一二列的值时,要时时的计算第三列的值。
而不是失去焦点时触发(onchange)计算。

也想过用组合的事件来元代,但使用onkeyup虽然也可以监听键盘的事件。
但是用鼠标粘贴的情况,onpaste事件只能取到粘贴前input的值。
怎么能取到粘贴后input的值?
如果可以,那么完全可以替代onpropertychange这种方法。谢谢,请帮我想想。。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

7条回答 默认 最新

  • 已采纳
    weixin_42518855 张鸭鸭 2009-10-24 10:54

    另外 clipboardData 可取剪贴板数据

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 2009-10-23 14:11

    用js代码赋值应该是不会触发事件的

    点赞 评论 复制链接分享
  • weixin_42518855 张鸭鸭 2009-10-23 17:17

    既然只是改值, 为什么不用onchange, 非用onpropertychange?

    点赞 评论 复制链接分享
  • weixin_42518855 张鸭鸭 2009-10-23 17:27

    其实你的代码也不是不触发onpropertychange事件, 只不过第一次用户修改不会触发,以后都触发, 用代码修改第一次也是触发的, 比较奇怪

    点赞 评论 复制链接分享
  • weixin_42518855 张鸭鸭 2009-10-23 17:29

    直接写的input 非js创建的,不存在此问题,很有意思,明天继续研究一下

    点赞 评论 复制链接分享
  • weixin_42518855 张鸭鸭 2009-10-24 09:14

    把脚本改为如下即可。

    var body = window.document.body; var txt = document.createElement("input"); txt.id = "txt"; txt.type = "text"; // 删除赋值代码 if(/msie/i.test(navigator.userAgent)){ txt.attachEvent("onpropertychange",handle); } else { txt.addEventListener("input",handle,false); }; body.appendChild(txt); // -----增加代码 document.getElementById("txt").value = "a";
    点赞 评论 复制链接分享
  • weixin_42518855 张鸭鸭 2009-10-24 10:50

    不好意思,的确还不行, 没辙了。 用延时赋值才行。


    //当状态改变的时候执行的函数 function handle() { //alert('输入的文字为:'+document.getElementById('txt').value); document.getElementById('msg').innerHTML='输入的文字为:'+document.getElementById('txt').value; } function init(){ var body = window.document.body; var txt = document.createElement("input"); txt.id = "txt"; txt.type = "text"; //txt.value = "a"; //只要在这里赋值,第一次value改变事件监听就不会触发 if(/msie/i.test(navigator.userAgent)){ txt.attachEvent("onpropertychange",handle); } else { txt.addEventListener("input",handle,false); }; body.appendChild(txt); // -----增加代码 setTimeout(setValue,1000); } function setValue(){ document.getElementById("txt").value = "a"; }




    测试
    请注意第一次录入数据,不论什么方式(键盘输入,键盘粘贴,鼠标粘贴)都不会改变,第二次就可以,
    这个问题是出现在使用DOM创建的input,并为input赋值,在页面里写的input没有这个问题



    window.onload = init;
    点赞 评论 复制链接分享

相关推荐