jquery - iframe 文档上的按键将整个 html 作为目标(不是确切的节点)

标签 jquery iframe keypress

我有一个带有 designMode="on"的 iframe (是的 - 我知道这是坏事)

我应该捕捉到点击它并按下按键并回显目标元素的节点名称。

$(function() {

var editor = $("#editor")[0].contentWindow;
var doc = editor.document;
editor.document.designMode = "on";
doc.open();
doc.write('<div id="dummy">test</div>');
doc.close();
// find iframe body
var $body = $("#editor").contents().find('#dummy').parent();
// clean after finding
$body.html('<div>Hello</div>');

var report = function(e) {
    $("#result").html(
    $("#result").html() + " " + e.target.nodeName.toLowerCase());
};

$body.click(report);

// $body.keypress(report) -> doesn't work
// only $(doc).keypress works:
$(doc).keypress(report);
});

当我点击单词“Hello”时 - 我得到“div” - 这是正确的,但是当我按下它时 - 我得到“html”而不是“div”。如何解决这个问题?

http://jsfiddle.net/fJLTG/

最佳答案

我创建了一个函数,它可以工作按键。

    var reportDomPath = function (e) {
        // 1. get caret cursor position node
        var selection, range, node, i_node;
        var tag = null;
        var iframe = document.getElementById('editor');
        var iframe_win = iframe.contentWindow || iframe.contentDocument;
        e = e || fwin.event;
        if (iframe_win.getSelection) {
            try {   // FF
                selection = iframe_win.getSelection();
                range = selection.getRangeAt(0);
                node = range.commonAncestorContainer;
            } catch (e) {
                return false;
            }
        } else {
            try {   // IE
                selection = iframe_win.document.selection;
                range = selection.createRange();
                node = range.parentElement();
            } catch (e) {
                return false;
            }
        }

        //2. parse DOM Path until HTML. The top of the "HTML" is "Document"

        i_node = node;
        do {
            if (i_node.nodeType != 1)
                continue;
            // get all of DOM Note
            if (tag == null) {
                tag = i_node.nodeName.toLowerCase();
            } else {
                tag = tag + ">>" + i_node.nodeName.toLowerCase();
            }
            // do_some_thing for each Node : obj.addClass('active'); or obj.removeClass('active'); and so on.
        } while (i_node = i_node.parentNode)

        //do_some_thing for all of note fwin.parent.do_some_thing(ret);

        var keyCode = e.charCode || e.keyCode;

        $("#result").html(
                $("#result").html() + "node dom path: " + tag + '   key' + e.type + ': keyCode: ' + keyCode + '<br>'
           );


    };

    $body.click(reportDomPath);
    $(doc).keypress(reportDomPath);   // only FF

但是 $(doc).keypress(reportDomPath) 仅适用于 FF。

关于jquery - iframe 文档上的按键将整个 html 作为目标(不是确切的节点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462935/

相关文章:

javascript - jquery ajax方法请求体为空但postman工作正常

html - 有没有办法强制 iframe 中的链接在新窗口中打开? iframe 内容位于不同的域中

AngularJS 退格键

java - 知道在 Java 中是否按下热键或快捷键

javascript - 区分按键按下和按键保持

javascript - 显示 pdf 的搜索文本以及页码

从 .value 中删除空格的 Javascript

Javascript api 在弹出窗口中打开外部页面

javascript - 如何在不同域上设置 iframe 内容的样式?

javascript - 如何用jQuery模拟输入点击、按空格键和退格键?