TinyEditor 加载后会动态插入一个 iframe,并且隐藏原先的 textarea。因为 textarea 的 oncontextmenu 事件不会自动复制过去,所以造成了这种现象。
解决这个问题的第一个方法,因为 iframe 页面中 body 的 id 为 editor,因此可以直接在 wb.showMenu 中判断,如果符合条件即弹出菜单:
import win.ui;
/*DSG{{*/
var winform = ..win.form( bottom=399;parent=...;text="aardio Form";right=599;scroll=1 )
winform.add( )
/*}}*/
import web.form;
var wb = web.form(winform);
import win.ui.menu;
var editorMenu = win.ui.popmenu(winform);
editorMenu.addTable({
{
"插入随机变量(&I)";
function () {
wb.execWb(13, "{随机变量}");
}
}
});
wb.showMenu = function(x, y, id, ele) {
var body = ele;
while (body && body.nodeName !== "BODY") {
body = body.parentElement;
}
if (body && body.id === "editor") {
editorMenu.popup();
}
return false;
}
wb.go("http://sandbox.scriptiny.com/tinyeditor/");
winform.show();
wb.wait();
win.loopMessage();
return winform, wb;
第二种方法,可以获取到 iframe 的 document.body,动态附加 oncontextmenu 事件:
import win.ui;
/*DSG{{*/
var winform = ..win.form( bottom=399;scroll=1;text="aardio Form";right=599;parent=...)
winform.add( )
/*}}*/
import web.form;
var wb = web.form(winform);
wb.showMenu = function(x, y, id, ele) {
return false;
}
wb.go("http://sandbox.scriptiny.com/tinyeditor/");
winform.show();
wb.wait();
var editorBody = wb.queryEles(tagName = "iframe").contentWindow.document.body;
import win.ui.menu;
var editorMenu = win.ui.popmenu(winform);
editorMenu.addTable({
{
"插入随机变量(&I)";
function () {
wb.execWb(13, "{随机变量}");
}
}
});
wb.attach(
function (event) {
editorMenu.popup();
}
, "oncontextmenu", editorBody
)
win.loopMessage();
return winform, wb;
第三种方法,将 contextmenu=... 事件绑定到 TinyEditor 框架页面的 body 中而不是 textarea 中。
|