2017-04-03 15 views
1

ブックマークjavascript:のブックマークを使ってページの動作を修正しようとしています。現在の環境でプラグイン(または他のほとんどのもの)を作成できないためです。showModalを使用して、約束どおりにコンテンツを完全にブロックする方法?

一部の種類のグローバルキャプチャが含まれているページでは、予想される入力キーを除いてほとんどすべてが正常に動作しています。このようなものは何が起こるかです:

(function(){ 
 
    window.dialog = dialog 
 
    function dialog (title, callback, value) { 
 
     let alertDialog = document.getElementById('alertDialog') 
 
     if (alertDialog) alertDialog.remove() 
 
     let htmlDiv = document.createElement('div') 
 
     let html = `<div>dummy</div> 
 
     <dialog id="alertDialog"> 
 
      <form method="dialog"> 
 
      <section> 
 
       <p> 
 
       <label for="value">${title}</label> 
 
       <br /> 
 
       <input type="text" name="value" value="${value}"> 
 
       </p> 
 
      </section> 
 
      <menu> 
 
       <button id="cancel" type="reset">cancel</button> 
 
       &nbsp; 
 
       <button type="submit">ok</button> 
 
      </menu> 
 
      </form> 
 
     </dialog> 
 
     <style>dialog#alertDialog input { width: 100%; } dialog#alertDialog menu { text-align: center; }</style>` 
 
     htmlDiv.innerHTML = html.replace(/^\s*</gm,'<').replace(/[\n\r\t\0\f\v]/g,'') // "minify" else append child fails, although... 
 
      .replace('> <', '><') // ...after jscompress minifies this and we paste into bookmark, it adds those spaces which would yield to append child error 
 
     alertDialog = htmlDiv.childNodes[1] 
 
     document.querySelector('body').appendChild(alertDialog) 
 
     let cancelButton = alertDialog.querySelector('#cancel') 
 
     if (cancelButton) cancelButton.addEventListener('click', function() { alertDialog.close() }) 
 
     let input = alertDialog.querySelector('input') 
 
     if (typeof callback === 'function') { 
 
      alertDialog.onsubmit = function(){ callback(input ? input.value : true) } 
 
      alertDialog.oncancel = function(){ callback(false) } 
 
     } 
 

 
     if (value !== undefined) { 
 
      alertDialog.showModal() // prompt 
 
     } else { 
 
      alertDialog.querySelector('input').remove() 
 
      if (title.substr(-1) === '?') { 
 
       alertDialog.showModal() // confirm 
 
      } else { 
 
       alertDialog.querySelector('#cancel').remove() 
 
       alertDialog.showModal() // alert 
 
      } 
 
     } 
 
     return null 
 
    } 
 

 
// dialog('foo!') 
 
}())
<body onkeypress="handle(event)"> 
 
<form action="#"> 
 
    <input type="text" name="txt" /> 
 
    <a href="javascript:window.dialog('foo!')">modal</a> 
 
</form> 
 

 
<script> 
 
    function handle(e){ 
 
     if(e.keyCode === 13){ 
 
      e.preventDefault(); // Ensure it is only this code that rusn 
 
      alert("Enter was pressed was presses"); 
 
     } 
 
    } 
 
</script> 
 
</body>

私はこのDOMを変更してformbodyからonkeypressを動かすことができれば、問題は解決しました。私は変更しようとしているページに入力キャプチャイベントがどこにあるか分からない。

alert,confirmおよび/またはpromptを使用する以外は、これを解決する一般的な方法がありますか? 1時間そこに私はusing promises or yield助けるかもしれないと思ったが、それはしなかった。

私は他の多くの問題を解決するため、(またはシンプルさと小さなコードを含む少なくともすべての機能を備えたもの)を使い続けたいと思います。

HTMLDialogElementインターフェイスのshowModal()メソッドが存在する可能性のある他のダイアログの上に、モーダルとしてダイアログが表示されます。

the docsはこれを約束行います。これは:: backdrop擬似要素とともに最上層に表示されます。ダイアログの外の対話がブロックされ、対話以外の対話が不活性になります。

しかし、それは今は完全ではありませんか?

答えて

0

最終的に!これはうまくいった。

最初に「onkeypressを無効にしようとしました」と考えましたが、この単なるインスタンスでは動作していましたが、私の環境にはありませんでした。ついに私は "ああ、たぶんそれはキーダウンにある"と考えました。それはそうだった。 :)

だから、ステートメントは完全に偽ではありません。必要に応じて行うことができるリソースがあるため、おそらくデザインごとに他のイベントが伝播するのを防ぐことはできません。 (すなわち、この場合、stopPropagation)。

(function(){ 
 
    window.overrideEnter = overrideEnter 
 
    function overrideEnter (event) { 
 
     if (event.keyCode == 13) { 
 
      event.stopPropagation() 
 
     } 
 
    } 
 
    window.dialog = dialog 
 
    function dialog (title, callback, value) { 
 
     let alertDialog = document.getElementById('alertDialog') 
 
     if (alertDialog) alertDialog.remove() 
 
     let htmlDiv = document.createElement('div') 
 
     let html = `<div>dummy</div> 
 
     <dialog id="alertDialog"> 
 
      <form method="dialog" onkeypress="return window.overrideEnter(event)" onkeydown="return window.overrideEnter(event)" onkeyup="return window.overrideEnter(event)"> 
 
      <section> 
 
       <p> 
 
       <label for="value">${title}</label> 
 
       <br /> 
 
       <input type="text" name="value" value="${value}"> 
 
       </p> 
 
      </section> 
 
      <menu> 
 
       <button type="submit">ok</button> 
 
       &nbsp; 
 
       <button id="cancel" type="reset">cancel</button> 
 
      </menu> 
 
      </form> 
 
     </dialog> 
 
     <style>dialog#alertDialog input { width: 100%; } dialog#alertDialog menu { text-align: center; }</style>` 
 
     htmlDiv.innerHTML = html.replace(/^\s*</gm,'<').replace(/[\n\r\t\0\f\v]/g,'') // "minify" else append child fails, although... 
 
      .replace('> <', '><') // ...after jscompress minifies this and we paste into bookmark, it adds those spaces which would yield to append child error 
 
     alertDialog = htmlDiv.childNodes[1] 
 
     document.querySelector('body').appendChild(alertDialog) 
 
     let cancelButton = alertDialog.querySelector('#cancel') 
 
     cancelButton.addEventListener('click', function(){ alertDialog.close(); callback(false) }) 
 
     let input = alertDialog.querySelector('input') 
 
     //console.log(input) 
 
     if (typeof callback === 'function') { 
 
      alertDialog.onsubmit = function(){ callback(input ? input.value : true) } 
 
      alertDialog.oncancel = function(){ callback(false) } 
 
      alertDialog.onclose = function(){} 
 
     } 
 

 
     document.onkeydown = function(event) { 
 
      event = event || window.event 
 
      if (event.keyCode == 13) { 
 
       event.stopPropagation() 
 
      } 
 
     } 
 
     if (value !== undefined) { 
 
      alertDialog.showModal() // prompt 
 
     } else { 
 
      input.remove() 
 
      input = undefined 
 
      if (title.substr(-1) === '?') { 
 
       alertDialog.showModal() // confirm 
 
      } else { 
 
       cancelButton.remove() 
 
       alertDialog.showModal() // alert 
 
      } 
 
     } 
 
     return null 
 
    } 
 
}())
<body onkeypress="handle(event)"> 
 
<form action="#"> 
 
    <input type="text" name="txt" /> 
 
    <a href="javascript:window.dialog('foo?', result => console.log(result))">modal</a> 
 
</form> 
 

 
<script> 
 
    function handle(e){ 
 
     if(e.keyCode === 13){ 
 
      e.preventDefault() 
 
      alert("Enter was pressed was pressed") 
 
     } 
 
     return true 
 
    } 
 
</script> 
 
</body>

関連する問題