1

下記の作成ページで、保存済みの html コンテンツを Gmail の編集可能な iframe に挿入するスクリプトを作成しています。このスクリプトは、Firefox の Greasemonkey でのみ使用できます。したがって、他のブラウザを考慮する必要はありません。

現在、テキストを一度挿入するとバグが発生します。range.setStart() は最初のパラメーターがノードであると想定しているためだと思いますが、これは createContextualFragment() は返しません。

現在のカーソルの位置に html を追加し、カーソルを追加された html の最後 (すべてのコンテンツの最後ではなく) に移動する他の方法はありますか?

https://mail.google.com/mail/?view=cm&fs=1&tf=1&source=mailto&to=example@example.com

function insertTextAtCursor(text) {
    var sel, range, html, textNode;
    if (window.frames[3].window.frames[0].getSelection()) {
        sel = window.frames[3].window.frames[0].getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt(0);
            range.deleteContents();
            textNode = range.createContextualFragment(text);
            //textNode = document.createTextNode(text);
            range.insertNode( textNode );
            range.setStart(textNode, textNode.length);
            range.setEnd(textNode, textNode.length);
            sel.removeAllRanges();
            sel.addRange(range);
            window.frames[3].window.frames[0].focus();
        }
    }
}

更新 1: html を挿入した後にカーソルを移動するようにコードにコメントすると、バグはなくなりますが、カーソルは同じ場所に留まります。

//range.setStart(textNode, textNode.length);
//range.setEnd(textNode, textNode.length);
sel.removeAllRanges();
//sel.addRange(range);
4

1 に答える 1

1

何かを得た。

この回答の助けを借りて、私はこれを書きました:

  1. カーソル位置にテキスト/htmlを貼り付けます
  2. カーソルをテキスト領域の末尾に移動します

これをtest.htmlとして保存し、ローカルでテストします

<html>

<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script>
    jQuery.fn.extend({
        insertAtCaret: function(myValue){
          return this.each(function(i) {
            if (document.selection) {
              //For browsers like Internet Explorer
              this.focus();
              sel = document.selection.createRange();
              sel.text = myValue;
              this.focus();
            }
            else if (this.selectionStart || this.selectionStart == '0') {
              //For browsers like Firefox and Webkit based
              var startPos = this.selectionStart;
              var endPos = this.selectionEnd;
              var scrollTop = this.scrollTop;
              this.value = this.value.substring(0, startPos)+myValue+this.value.substring(endPos,this.value.length);
              this.focus();
              this.selectionStart = startPos + myValue.length;
              this.selectionEnd = startPos + myValue.length;
              this.scrollTop = scrollTop;
            } 
            else {
              this.value += myValue;
              this.focus();
            }
          })
        }
    });

    var myhtml = '<b> this html will be <i>added</i> to the </b> cursor position (and will move to the end)';
    var movetotheendof = '';
    $(window).load(function(){
        $('#btnpastepre').click(function() {
            $('#txtarea').insertAtCaret(myhtml)
            movetotheendof = $('#txtarea').val()
            $('#txtarea').val("").val(movetotheendof)
        })
    });
    </script>
</head>

<body>

    <div id="formcontainer">
        <button id="btnpastepre">click to paste</button>

        <form id="formulario">
            <textarea id="txtarea" cols=60 rows=20></textarea>
        </form>
    </div>

</body>

</html>

または、ここをクリックしてオンラインでテストしてください: http://jsfiddle.net/RASG/Vwwm4/

あとは、必要に応じて変更するだけです (gmail またはその他のサイト)。

編集

あなたが GM スクリプトを欲しがっていたことを忘れていました :)
ここにあります

// ==UserScript==
// @name        TESTE 3
// @namespace   TESTE 3
// @description TESTE 3
// @require     http://code.jquery.com/jquery.min.js
// @include     *
// @version     1
// ==/UserScript==


jQuery.fn.extend({
    insertAtCaret: function(myValue){
        return this.each(function(i) {
            if (document.selection) {
                //For browsers like Internet Explorer
                this.focus();
                sel = document.selection.createRange();
                sel.text = myValue;
                this.focus();
            }
            else if (this.selectionStart || this.selectionStart == '0') {
                //For browsers like Firefox and Webkit based
                var startPos = this.selectionStart;
                var endPos = this.selectionEnd;
                var scrollTop = this.scrollTop;
                this.value = this.value.substring(0, startPos)+myValue+this.value.substring(endPos,this.value.length);
                this.focus();
                this.selectionStart = startPos + myValue.length;
                this.selectionEnd = startPos + myValue.length;
                this.scrollTop = scrollTop;
            } 
            else {
                this.value += myValue;
                this.focus();
            }
        })
    }
});

var myhtml = '<b> this html will be <i>added</i> to the </b> cursor position (and will move to the end)';
var movetotheendof = '';

$(window).load(function(){
    $('#btnpastepre').click(function() {
        $('#txtarea').insertAtCaret(myhtml)
        movetotheendof = $('#txtarea').val()
        $('#txtarea').val("").val(movetotheendof)
    })
})

このコンテンツを含む html ファイルを作成してテストするだけです

<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
    <div id="formcontainer">
        <button id="btnpastepre">click to paste</button>
        <form id="formulario">
            <textarea id="txtarea" cols=60 rows=20></textarea>
        </form>
    </div>
</body>
</html>
于 2012-09-17T13:26:31.140 に答える