aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 9780|回复: 2

框架里的编辑器如何调用主程序设定的右键菜单?

[复制链接]

2

主题

3

回帖

39

积分

新手入门

积分
39
发表于 2012-5-3 17:50:56 | 显示全部楼层 |阅读模式
本帖最后由 aloneliu 于 2012-5-3 17:53 编辑

  1. wb.showMenu=function(x,y,id,ele){
  2.     return false; //禁用默认菜单
  3. }
  4. wb.external={
  5. ext_right_menu = function(){
  6. right_menu();
  7. };
  8. }
  9. //右键
  10. right_menu = function(){
  11. popmenu = win.ui.popmenu(winform);
  12. popmenu.add('插入随机变量',function(id){
  13.   wb.execWb( 13,'{随机变量}' )  
  14. });
  15. popmenu.popup(x,y,true);
  16. }
复制代码
网站中
  1. <textarea name="detail" id="detail" style="width:900px; height:380px" oncontextmenu="window.external.ext_right_menu();"></textarea>
复制代码
此时能用右键

用了编辑器(tiny editor)后,这个textarea区域变成了一个框架,右键就不行了

33

主题

496

回帖

3294

积分

荣誉会员

积分
3294
发表于 2012-5-3 23:03:12 | 显示全部楼层
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 中。

点评

真棒: 5.0
真棒: 5
lujjjh威武  发表于 2012-5-4 20:45
真棒: 5
  发表于 2012-5-4 09:32

2

主题

3

回帖

39

积分

新手入门

积分
39
 楼主| 发表于 2012-5-8 22:02:17 | 显示全部楼层
lujjjh 真的很有心,{:soso_e179:}谢谢
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2026-1-18 21:53 , Processed in 0.059744 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表