项目中需要输入code,按回车自动提交页面。本人做的函数如下:function testEnterToTab(event,flg) {    
    var e = event?event:window.event;  
    if(e.keyCode == 13){
        if ('s' == flg) {             
            doSearchS_Barcode();//提交相关函数
        } else if ('b' == flg) {
            doSearchB_Barcode();//提交页面相关函数
        }      
    }
}调用如下:<html:text  name="CollectionLendForm" styleId="s_barcode" property="s_barcode" size="18" maxlength="32" style="width:200px;" onkeydown="testEnterToTab(event, 's');" tabindex="1"/>可以正常运行。
现在客户要求在输入完code以后,能够给出提示音,类似消息框的报警音。
于是本人又做函数如下:function tospeakSound() {
    var sLen = <%= sLen %>;     
    var sbarcode = document.forms[0].s_barcode;
    if (sbarcode.value.Trim().length == sLen) {
        document.getElementsByTagName("bgsound")[0].src = '<%= ctxtPath %>/images/music/ding.wav';
    }
}然后在对应的控件中追加上面这个方法:<html:text  name="CollectionLendForm" styleId="s_barcode" property="s_barcode" size="18" maxlength="32" style="width:200px;" onkeydown="testEnterToTab(event, 's');" onchange="tospeakSound();" tabindex="1"/>当输入完code焦点离开时,确实发出了提示音,但是当暗回车提交页面时,出现错误如下:
错误: uncaught exception: [Exception... "Cannot modify properties of a WrappedNative"  nsresult: "0x80570034 (NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN)"  location: "JS frame :: chrome://global/content/bindings/autocomplete.xml :: onxblpopuphiding :: line 834"  data: no]望高手指点,高分求解。

解决方案 »

  1.   

    失去焦点的事件应该是onblur吧?在body中加入对keydown事件的监控,如果按键是回车,就提交。
      

  2.   

    onchange没用过, 考虑你的逻辑,可能是因为你在按回车后, FORM提交,这时input值清空onchange触发, 但在这时页面已经
    跳转,你在tospeakSound()用的方法可能会有问题如2楼用, onblur 试试...
      

  3.   

    应该是doSearchS_Barcode里有错误把
      

  4.   

    这是那两个提交方法,应该没错。//query b_barcode
    function doSearchB_Barcode(){
        var b_barcode = document.CollectionLendForm.b_barcode;     
        if(!ChkChr('<bean:message key="caption.library.master.booksmaintenace.b_barcode" />',b_barcode.value,0,0,1)){
        b_barcode.focus();
        return false;
        }
        if (b_barcode.value.match(/[^0-9]{1}/)) {
            alert('<bean:message key="caption.library.master.booksmaintenace.b_barcode.err1"/>');
        b_barcode.focus();
        return;
        }
        
        document.forms[0].actionHidden.value="<bean:message key="caption.library.lend.submit_query_b_barcode"/>";
        document.forms[0].submit();
    }
    //query s_barcode
    function doSearchS_Barcode(){
        document.forms[0].actionHidden.value="<bean:message key="caption.library.lend.submit_query_s_barcode"/>";
        document.forms[0].submit();
    }其实我要的效果是用户输入后,就发出提示音,但是用了onchange事件好像但输入完,并没有触发事件,只有我在输入框外点鼠标时,才会触发,所以我描述的时候用了焦点离开。
    现在我又试了onblur事件。还是当焦点离开时会触发事件发出提示音,但是当按回车提交页面时,页面就报错了。而且肯定带来了新的问题,那就是本来回车转焦点提交时,按回车的时候js方法testEnterToTab()就把焦点转移了,那样又会引发tospeakSound();
    希望高手能解答,cgisir帮忙分析分析,谢谢。
      

  5.   

    跟踪了一下,确实发现是doSearchS_Barcode()方法里面有错,提交了,但是session掉了,所以程序出错了。为什么这样呢?
    还有想请教高手为什么onchange事件,当输入完code时,如果鼠标不在外面点一下,或者用tab跳一下焦点,他就不触发事件呢?
      

  6.   

    试试下面的2个方法:
    第一种:
    function tospeakSound() {
                var sLen = <%= sLen %>;            
                var sbarcode = document.forms[0].s_barcode;
                if (sbarcode.value.Trim().length == 0) {return}//为空跳出
                document.getElementsByTagName("bgsound")[0].src = '<%= ctxtPath %>/images/music/ding.wav';           
            }
    其他不变,维持你的源码第二种:
    onchange改onpropertychange(IE)、oninput(FF)试一下
      

  7.   

    另外,你可以单步跟踪一下问题出在什么地方。例如在IE下,
    function tospeakSound() { 
    debugger;
      

  8.   

    找出点线索来了,是session丢失了。但是为什么会造成session丢失,原因还没找到,因为没加这个报警音的话,程序按回车提交是正常的,没问题的。谢谢楼上大哥,你说的我也参考一下,还有关于js的debug我现在只知道alert和用ff看报错消息,关于你说的debugger是什么东东啦?怎样调试好?
      

  9.   

    查了一下资料,了解到:
    [code=INIFile]
    用onpropertychange,oninput事件解决onchange事件的不足.onchange在用于文本框输入框时,有一个明显的不足. 事件不会随着文字的输入而触发,而是等到文本框失去焦点(onblur)时才会触发. 也就是没有即时性!在IE下,可以用onpropertychange来代替onchange事件,当文本框有任何变化时,能立即触发此事件.
    [/code]
    但是程序中为什么会造成session丢失了,确实比较郁闷啦。希望高手能给予指点。
      

  10.   

    发现不是session丢失而是session中的一个键值丢失了。望哪位高手指点一下。
      

  11.   


    在IE浏览器下,
    function tospeakSound() {
    debugger; //敲上这几个字母,告诉浏览器,运行到此要中断一下
    //.......后面是你的脚本
    //.......
    }刷新界面,会提示你脚本中有异常,是否进入调试模式? 点【是】,进入你机器的默认调试器,按F11单步调试。这样你可以准确找到出错的原因
      

  12.   

    哦,谢谢楼上大哥,现在就是session丢失了某个键值。具体原因不明啦。如果不做这个提示音的话,程序还是没问题啦。
      

  13.   

    你把那个ding.wav放到当前目录来,然后:
    document.getElementsByTagName("bgsound")[0].src = 'ding.wav';
      

  14.   

    谢谢楼上的兄弟,我现在换了另外一个方法,关键好像还是bgsound造成了session的键值丢掉了,具体原因不太清楚。
    改了tospeakSound()方法:function tospeakSound() {
        var sLen = <%= bLength %>;          
        var sbarcode = document.forms[0].s_barcode;     
        if (sbarcode.value.Trim().length == sLen) {         
            var bgTest = document.createElement("bgsound");
            bgTest.src = "<%= ctxtPath %>/images/music/Bar.wav";
            document.body.appendChild(bgTest);         
        }
    }还有那个onpropertychange,oninput好像在我的struts标签中用不了,所以还是不能达到实时的发出提示音,必须焦点离开以后才行。
      

  15.   

    你的ctxtPath 打印出来是什么路径?问题会不会在这里造成的?
    参考我15楼的建议
      

  16.   

    ctxPath是自己定义的一个变量,是服务器根目录,这个没有问题的。
    我现在用的我16楼改的这个js重新创建一个bgsound,就没问题;然后我的struts标签中不能用onpropertychange,
    我现在用的onkeyup配合onchange一起使用,勉强可以实现我要的效果。但是现在心里还是有个疙瘩,
    就是为什么在页面中直接定义了一个bgsound设置他的src为空,然后调用我最开始描述的那个tospeakSound()就会有问题,
    而且即便我不调用tospeakSound,提交的时候session的那个键值也掉了,所以我现在在怀疑这个bgsound是不是有所诡异?
    不得其解。
      

  17.   

    你网站里几个GLOBE.ASA?如果只有一个的话,session丢失找其他原因;如果是几个、且分别在不同的目录下就容易出这样的问题。这就是我建议你把wav文件放到当前目录来的原因。session丢失是顽疾,要找根源因素太多了....
      

  18.   

    谢谢楼上老兄,不过我用的不是asp,我是用的java,框架是struts,所以没有你所说的Globe.ASA,session好像也没完全掉,是某个键值为null了。现在暂时是实现了效果。我照你说的换个目录看看。
      

  19.   

    这个问题我也遇到了。应该和你的bgsound无关。
    uncaught exception: [Exception... "Cannot modify properties of a WrappedNative"  nsresult: "0x80570034 (NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN)"  location: "JS frame :: chrome://global/content/bindings/autocomplete.xml :: onxblpopuphiding :: line 825"  data: no]不影响我的程序,但是看到这个错误也是很揪心。