Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 模态对话框(showModalDialog())在IE9中运行不正常_Javascript_Html_Internet Explorer_Internet Explorer 9_Showmodaldialog - Fatal编程技术网

Javascript 模态对话框(showModalDialog())在IE9中运行不正常

Javascript 模态对话框(showModalDialog())在IE9中运行不正常,javascript,html,internet-explorer,internet-explorer-9,showmodaldialog,Javascript,Html,Internet Explorer,Internet Explorer 9,Showmodaldialog,场景:HTML页面中有一个输入元素,您可以在其中输入任何数字/文本。如果输入了两个连续字符,那么我将调用showmodaldiallog()方法打开一个弹出窗口,其中包含另一个输入元素。在父页面中输入的任何字符都将复制到该搜索框中 问题:如果用户键入一个文本快速(不间断)以搜索超过2个字符(例如苹果公司),则键入的第3个和/或第4个字符将丢失(不通过按键事件跟踪)。我的意思是只有aple单词被复制到弹出窗口中的搜索框中。所以用户需要重新键入文本 所需解决方案:每当用户键入任何文本时,都需要触发弹

场景:HTML页面中有一个输入元素,您可以在其中输入任何数字/文本。如果输入了两个连续字符,那么我将调用showmodaldiallog()方法打开一个弹出窗口,其中包含另一个输入元素。在父页面中输入的任何字符都将复制到该搜索框中

问题:如果用户键入一个文本快速(不间断)以搜索超过2个字符(例如苹果公司),则键入的第3个和/或第4个字符将丢失(不通过按键事件跟踪)。我的意思是只有aple单词被复制到弹出窗口中的搜索框中。所以用户需要重新键入文本

所需解决方案:每当用户键入任何文本时,都需要触发弹出窗口,并且需要将所有字符复制到弹出窗口中的搜索框中

环境:仅在IE9中复制

语言:HTML、Javascript

注意:我分析的是,由于触发弹出窗口时有一个延迟,所以在两个字符之后键入的字符会丢失我不知道为什么只有在IE9中才会出现这种情况我也无法升级到IE10来解决问题

但我还是被这个问题困住了。有没有其他解决办法?有没有其他方法可以通过其他元素获得模态对话框的所有功能

下面是父HTML的示例代码片段:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Test Page</title>
    <script type="text/javascript">
    var checkSeq = new RegExp("[a-zA-Z]{2}", "i");
     function handleShowModalPopUp(fieldValue){
        if(checkSeq.test(fieldValue)){
            window.showModalDialog("popUpPage.html", document.getElementById('searchElem').value, "");
        }
     }

    </script>

    </head>
    <body>
        Enter Search Term :  
        <input type="text" id="searchElem" value="" onkeyup="handleShowModalPopUp(this.value)">

    </body>
    </html>

测试页
var checkSeq=newregexp(“[a-zA-Z]{2}”,“i”);
函数handleShowModalPopUp(字段值){
如果(检查顺序测试(字段值)){
showModalDialog(“pouppage.html”,document.getElementById('searchElem').value,”);
}
}
输入搜索词:
这是弹出窗口HTML(pouppage.HTML)

        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Search Dialog</title>
            <script type="text/javascript">
                function handleOnload(){
                    var searchVal = window.dialogArguments;
                    if(null!= searchVal){
                        document.getElementById('searchElem').value = searchVal;
                    }           
                }
            </script>
        </head>
        <body onload="handleOnload()">
            <input type="text" id="searchElem">
            <input type="button" value="Search">    
        </body>
        </html>

搜索对话框
函数handleOnload(){
var searchVal=window.dialogArguments;
if(null!=searchVal){
document.getElementById('searchElem')。value=searchVal;
}           
}

您真正想做的是延迟弹出窗口的打开,直到用户停止键入。检测用户是否已停止键入只需检测在可能发生击键的时间内是否未发生任何事情。因此,与其打开模式窗口,不如在没有击键的情况下,延迟一段时间后再打开它

下面是我编写的一些代码,应该对您有所帮助。我已将延迟设置为500毫秒

<html>
<head>
<script>
function DelayedPopup(delayThreshold) {
    this.delay = delayThreshold;
    this.lastSearchValue = undefined;
    this.popEvent = 0;
} 

DelayedPopup.prototype = { 
    needsDelay:  function() {
        return this.searchValue() != this.lastSearchValue;
    },

    searchValue: function() {
        return document.getElementById('searchElem').value;
    },

    openPopup: function() {
        window.showModalDialog("popUpPage.html", "");
    },

    popupOrDelay: function() {
        if (this.needsDelay()) {
            this.popup();
        }
        else {
            this.openPopup();
            this.popEvent = 0;
        } 
    },

    popup: function() {
        this.lastSearchValue = this.searchValue();          

        if (this.popEvent) {
            clearInterval(this.popEvent);
        } 

        var self = this;
        this.popEvent = setTimeout(function() { self.popupOrDelay(); }, this.delay);        
    }
};

var delayedPopup = new DelayedPopup(500);
</script>
</head>

<body>
<input type="text" id="searchElem" onkeyup="if (this.value.length > 2) delayedPopup.popup()">
</body>
</html>

函数DelayedPopup(delayThreshold){
this.delay=delayThreshold;
this.lastSearchValue=未定义;
this.popEvent=0;
} 
DelayedPopup.prototype={
needsdlay:function(){
返回this.searchValue()!=this.lastSearchValue;
},
searchValue:function(){
返回document.getElementById('searchElem')。值;
},
openPopup:function(){
showmodaldiallog(“pouppage.html”和“”);
},
popupOrDelay:function(){
if(this.needsDelay()){
这个.popup();
}
否则{
这个.openPopup();
this.popEvent=0;
} 
},
弹出:函数(){
this.lastSearchValue=this.searchValue();
if(this.popEvent){
clearInterval(this.popEvent);
} 
var self=这个;
this.popEvent=setTimeout(函数(){self.popuperDelay();},this.delay);
}
};
var delayedPopup=新的delayedPopup(500);

不要使用需要整个页面的模式对话框(以及HTTP请求和延迟)?为什么不直接使用div作为模式弹出窗口,比如Bootstrap或jqueryui中的弹出窗口……或者编写自己的弹出窗口。谢谢。我需要阻止用户访问父页面,还需要阻止其上的所有事件(onBlur、onChange…)。所以我认为模态对话框是一个更好的选择。我们还有其他与模态对话框相同的选项吗?如果没有
showModalDialog()
,您将无法获得真正的模态体验,但您很可能会继续体验延迟,因为它会加载新页面,尤其是在存在网络延迟的情况下。“假”模式对话框(如)不会阻止所有事件,但对于大多数目的来说已经足够了。由于您没有加载新页面,因此应该没有延迟。这只是页面上的另一个元素,但我还是被这个问题困住了。有没有其他解决办法?是否有其他方法可以使用其他元素获得模态对话框的所有功能?感谢您的帮助:)我已经试过了,但如果用户类型不一致,字符会再次丢失。我不明白为什么这个问题只出现在IE9上。我在@Sanjeev look closer中引入了更简单的延迟版本,你会发现你所建议的不是更简单的版本,而是完全相同的版本。我只是以不同的方式编写,以满足您的需求。