如何从Safari发送Safari中的键盘事件(例如,退格键,删除键

问题描述 投票:3回答:1

我正在为Javascript应用程序实现屏幕键盘。文本应出现在textarea-Element中。创建文本事件没有问题,但是感觉无法创建非文本事件,例如Backspace。这是一些示例代码:

测试Textarea事件 title><script type="“" text javascript>功能日志(文本){var elem = document.getElementById(“ log”);如果(elem){elem.innerHTML + =“ <br/>” +文字;}}函数logEvent(e){log(“ Type:” + e.type +“,其中:” + e.which +“,keyCode:” + e.keyCode +“,charCode:” + e.charCode +“,keyIdentifier:” + e.keyIdentifier +“,数据:” + e.data);}函数logClear(){var elem = document.getElementById(“ log”);如果(elem){elem.innerHTML =“”;}}函数sendBackEvent(){var textarea = document.getElementById(“ textarea”);if(!textarea){返回;}var ke1 = document.createEvent(“ KeyboardEvent”);ke1.initKeyboardEvent(“ keydown”,true,true,window,“ U + 0008”,0,“”); // U + 0008->退格键//如何设置“ keyCode”和“哪个”?// 1. ke1.keyCode = 8;由于“可写:错误”而将被忽略// 2. delete ke1.keyCode也将被忽略//和Object.defineProperty(KeyboardEvent.prototype,“ keyCode”,...随便...);//由于“ configurable:false”将导致异常// 3.产生更一般的事件(例如“ var e = document.createEvent(” Events“);”)//并设置所有必要的道具(例如“ e.initEvent(” keydown“,true,true); e.keyCode = 8; e.which = 8;”)//将起作用,但是文本区域将忽略该事件textarea.dispatchEvent(ke1);var ke2 = document.createEvent(“ KeyboardEvent”);ke2.initKeyboardEvent(“ keyup”,true,true,window,“ U + 0008”,0,“”); // U + 0008->退格键//与上述相同的问题textarea.dispatchEvent(ke2);}函数init(){var textarea = document.getElementById(“ textarea”);if(!textarea){返回;}textarea.addEventListener(“ keydown”,logEvent,false);textarea.addEventListener(“ keypress”,logEvent,false);textarea.addEventListener(“ keyup”,logEvent,false);textarea.addEventListener(“ textInput”,logEvent,false);}</ SCRIPT></ HEAD><body onload =“ init()”><textarea id =“ textarea” name =“ text” cols =“ 100” rows =“ 20”> </ textarea> <br/> <br/><button onclick =“ sendBackEvent()”>发送BackEvent </ button><button onclick =“ logClear()”>清除日志</ button> <br/><div id =“ log”> </ div></ BODY></ HTML></pre><p>这里有趣的功能是<code>sendBackEvent()</code>。我尽力获得与按下物理键盘上的Backspace-Button完全相同的事件,但未成功。</p><p>我知道这里有一个<a href="https://bugs.webkit.org/show_bug.cgi?id=16735" rel="nofollow" target="_blank">Webkit-Bug</a>,但希望可以有其他方法使它起作用。有人遇到过同样的问题吗?可以解决吗?怎么样?提议的解决方案<a href="https://stackoverflow.com/questions/961532/firing-a-keyboard-event-in-javascript" rel="nofollow" target="_blank">here</a>(调用new <code>KeyboardEvent(...)</code>)不起作用,因为直接调用KeyboardEvent构造函数会导致以下异常:</p><blockquote><p>异常:TypeError:'[object KeyboardEventConstructor]'不是构造函数(正在评估'new KeyboardEvent(...)']</p></blockquote><p>我再也没有想法。</p></div><p class="desc">我正在为Javascript应用程序实现屏幕键盘。文本应出现在textarea-Element中。创建文本事件没有问题,但感觉无法创建非文本事件,例如...</p></div> <div class="answers"><div class="answer" vote="3" tick="True"><div class="post-text" itemprop="text"><p>由于似乎没有出路,我发现自己不得不安装自己的Backspace事件处理程序。工作代码(现在不记录)在这里:</p><pre><HTML><HEAD><title>测试Textarea事件</ title><script type =“ text / javascript”>函数sendBackEvent(){var textarea = document.getElementById(“ textarea”);if(!textarea){返回;}var ke1 = document.createEvent(“ Events”);ke1.initEvent(“ keydown”,true,true);ke1.keyCode = ke1.which = 8; //退格键textarea.dispatchEvent(ke1);var ke2 = document.createEvent(“ Events”);ke2.initEvent(“ keyup”,true,true);ke2.keyCode = ke2.which = 8; //退格键textarea.dispatchEvent(ke2);}函数handleBackEvent(e){if(e.keyCode!= 8){返回;}如果(textarea.value.length == 0){返回;}var text = textarea.value;var selectionStart = textarea.selectionStart;var selectionEnd = textarea.selectionEnd;如果(selectionStart <selectionEnd){var text1 =(selectionStart> 0?text.slice(0,selectionStart):“”);var text2 =(selectionEnd <text.length?text.slice(selectionEnd):“”);textarea.value = text1 + text2;}否则,如果(selectionStart> 0){var text1 =(selectionStart-1> 0?text.slice(0,selectionStart-1):“”);var text2 =(selectionStart <text.length?text.slice(selectionStart):“”);textarea.value = text1 + text2;selectionStart--;}textarea.selectionStart = textarea.selectionEnd = selectionStart;e.preventDefault();e.stopPropagation();返回false;};var textarea;函数init(){textarea = document.getElementById(“ textarea”);if(!textarea){返回;}textarea.addEventListener(“ keydown”,handleBackEvent,false);}</ SCRIPT></ HEAD><body onload =“ init()”><textarea id =“ textarea” name =“ text” cols =“ 100” rows =“ 20”> </ textarea> <br/> <br/><button onclick =“ sendBackEvent()”>发送BackEvent </ button></ BODY></ HTML></pre><p>以防万一其他人遇到同样的麻烦。</p></div></div></div></div></script>
javascript safari dom-events keyboard-events
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.