Javascript 获取可编辑iframe ONDBL中元素的属性单击
我正在使用javascript和可编辑的iframe开发一个wysiwyg HTML编辑器。在开发该编辑器之前,我对使用javascript和iFrame(包括)的其他HTML编辑器进行了一些研究,其中有一个特性我正在努力复制 在一些基于iframe/JS的HTML编辑器中,如果用户希望访问或编辑元素的属性(例如图像维度、超链接url、表格宽度),他们只需双击元素,就会出现一个模式div,其中包含该元素和/或该元素中元素的属性值的文本框 到目前为止,我最接近于开发这样一个特性的是创建一个脚本,该脚本可以提醒用户双击iframe中某个区域的HTML代码。我将此代码添加到我的HTML页面Javascript 获取可编辑iframe ONDBL中元素的属性单击,javascript,html,iframe,wysiwyg,Javascript,Html,Iframe,Wysiwyg,我正在使用javascript和可编辑的iframe开发一个wysiwyg HTML编辑器。在开发该编辑器之前,我对使用javascript和iFrame(包括)的其他HTML编辑器进行了一些研究,其中有一个特性我正在努力复制 在一些基于iframe/JS的HTML编辑器中,如果用户希望访问或编辑元素的属性(例如图像维度、超链接url、表格宽度),他们只需双击元素,就会出现一个模式div,其中包含该元素和/或该元素中元素的属性值的文本框 到目前为止,我最接近于开发这样一个特性的是创建一个脚本,该
<iframe name="wysiwyg" id="wysiwyg" onload="dblClick();"></iframe>
问题是,此代码仅在用户双击并突出显示一段文本时有效,例如,双击一段粗体文本将向用户提示此代码
<b>text</b>
文本
我双击的任何其他内容都会提示错误消息。此外,它只能在Internet Explorer中正常工作。当我在Firefox、Opera、Chrome和Safari中测试它时,脚本要么不工作,要么工作不正常(在Firefox中,一旦加载页面,脚本就会发出错误消息)
我需要的是一个脚本,允许最终用户查看他们在可编辑iframe中双击的任何元素的所有属性,并在所有主要浏览器中工作
var iframeWin;
function dblClick() {
iframeWin = document.getElementById("wysiwyg").contentWindow;
iframeWin.document.ondblclick = dblClicked;
}
function dblClicked(evt) {
evt = evt || iframeWin.event;
var target = evt.target || evt.srcElement;
alert(target.tagName);
}
我知道简单地使用现有的所见即所得编辑器会更容易,但我更喜欢从头开始创建自己的编辑器,因为我喜欢这个挑战。另外,我知道CKEditor似乎没有使用像我这样的iframe,但我引用它作为我希望实现的那种功能的示例
任何帮助都将不胜感激。我建议将问题分为可管理的部分来解决,而不是试图一下子把所有问题都集中起来。例如,我会将其分解为:
元素本身。这最终是将在
中运行的代码,您可以通过将其直接附加到
HTML,或通过在调用页面的上下文中运行一些代码(如您当前所做的)将其放在那里窗口。\u doubleClickHandler
。此函数定义属于
的内部
的点击事件进行交互
时,封闭页面可以为您在步骤2中定义并在步骤3中删除的函数提供自己的定义如果您完成了所有这些,我建议您可以做更多有用的事情,然后在其中显示一个带有单击元素标记的警报。如在HTML编辑器中自动选择/突出显示相应的标记,或将标记片段加载到可编辑的lightbox UI中,用户可以在其中进行更改,然后将其自动应用于正在编辑的HTML文档。这里有各种问题/误解:
- 您只使用IE的旧选择和
API,这在其他浏览器中不受支持李>TextRange
- 您似乎不确定如何访问iframe的文档,并且不必要地附加了两次
处理程序dblclick
- CKEditor确实使用iframe
var iframeWin;
function dblClick() {
iframeWin = document.getElementById("wysiwyg").contentWindow;
iframeWin.document.ondblclick = dblClicked;
}
function dblClicked(evt) {
evt = evt || iframeWin.event;
var target = evt.target || evt.srcElement;
alert(target.tagName);
}
我明白你的意思,我意识到我问的问题太多了,一个问题也回答不了。当我有更多的时间的时候,我会更详细地看我的问题,并把它分解成几个问题。感谢您提供的指导。我知道CKEditor不使用iFrame。我把它作为我最终想要实现的功能的一个例子。我使用了您发布的代码,但它似乎没有任何作用。我双击iframe中的元素,但什么也没发生。基本上,我所做的就是用您的函数替换旧的dblClick()和dblClicked()函数。我不确定我会错在哪里。任何帮助都将不胜感激。您的代码确实有效。问题是,它只适用于IE、Chrome和Safari。它只在iframe不处于设计模式(这对于所见即所得编辑器来说毫无意义)的情况下在Firefox中起作用,而在Opera中根本不起作用(打开或关闭设计模式)。@siberantiger:有趣。我会试着调查一下。非常感谢。顺便说一下,如果您需要查看我正在使用的代码,我会将其全部放在我之前发布的问题中。我不知道这是否有帮助,但我正在使用最新版本的Firefox和Opera(最新版本是2011年8月中旬,尽管我认为我的Opera版本自那时以来已经自我更新)。我只是想提一下。