#svg #contextmenu #raphael #right-click
#svg #контекстное меню #рафаэль #щелкните правой кнопкой мыши
Вопрос:
Поддерживает ли Raphael наличие контекстного меню правой кнопкой мыши?? Я изучаю, как наилучшим образом визуализировать диаграмму, подобную UML, но также предоставить пользователю возможность навести курсор мыши на один из элементов и сказать «создать связь» или «создать новый узел» (поэтому было бы неплохо щелкнуть правой кнопкой мыши меню). Я пытаюсь понять, поможет ли мне Raphael.
мой вопрос похож на приведенный выше.
у меня есть поддержка javascript, щелкните правой кнопкой мыши меню о демонстрации svg.
svgmenu.js файл:
var CurveControl = null;
var SvgMainMapDoc = null;
function winLoad(){
CurveControl = document.getElementById('NavigateControl');
if(CurveControl==null)
return;
SvgMainMapDoc = CurveControl.getSVGDocument();
faireMenus("menu1");
}
function faireMenus(udefMenuID){//== udefMenuID:svg预定义的菜单编码
var udef_menu = udefMenuID;
var mydoc = SvgMainMapDoc;
var contextMenu = CurveControl.window.contextMenu;
var menuXml = CurveControl.window.printNode(mydoc.getElementById(udef_menu));
//alert(menuXml);
CurveControl.window.Titi = Titi;
CurveControl.window.printit = printit;
CurveControl.window.colorit = colorit;
CurveControl.window.showmsg = showmsg;
changeMenus(menuXml);
}
function changeMenus(menuXml){//== xml格式的菜单字符串
var contextMenu = CurveControl.window.contextMenu;
var newMenuRoot = CurveControl.window.parseXML(menuXml, contextMenu);
contextMenu.replaceChild(newMenuRoot, contextMenu.firstChild);
}
function Titi()
{
var msg = "test";
alert(msg);
}
function printit(){
if (confirm('确定打印吗?')){
try {
if(parent) parent.print();
}
catch(e){}
}
}
function colorit(clr){ //背景色函数
var myob = SvgMainMapDoc.getElementById("rect_back");
if(myob) myob.setAttribute("fill", clr);
}
function showmsg(msg){
alert(msg);
}
svgmenu.svg файл:
<?xml version="1.0" encoding="utf-8" ?>
<svg id="cont" viewBox="0 0 450 320" width="450" height="320"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve" preserveAspectRatio="none">
<defs>
<menu id='menu1'>
<header>Menu utilisateur</header>
<item action="CopySVG" id="CopySVG">复制图形</item>
<separator/>
<menu>
<header>背景颜色</header>
<item onactivate="colorit('white')">白色</item>
<item onactivate="colorit('black')">黑色</item>
<item onactivate="colorit('#D0D063')">黄色</item>
<item onactivate="colorit('green')">绿色</item>
<separator/>
<item onactivate="colorit('#008083')">默认</item>
</menu>
<separator/>
<item action="Pause" id="Pause">暂停</item>
<separator/>
<item id='Menu1.2' onactivate='printit(this)'>打印</item>
<separator/>
<item id='Menu1.1' onactivate='Titi()'>操作说明</item>
</menu>
<menu id='menu2'>
<item id='Menu1.2' onactivate="showmsg('控件ID')">控件ID</item>
</menu>
</defs>
<g id="elements">
<rect id="rect_back" class="Gas" x="0" y="0" width ="450" height="320" fill="#ffff33">
</rect>
<rect id="gas_1" class="Gas" x="0" y="0" width ="145" height="145" fill="#00ff33" onmouseover="faireMenus('menu2')" onmouseout="faireMenus('menu1')">
</rect>
</g>
</svg>
svgmenu.html файл:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title></title>
<script language="JavaScript" src="svgmenu.js"></script>
</head>
<body onload="winLoad()">
<embed id="NavigateControl" width="100%" height="100%" src="svgmenu.svg" type="image/svg xml" >
</body>
</html>
но….
я хочу использовать RaphaelJS для создания svg gragh.
какой-нибудь рафаэль (ссылка:http://raphaeljs.com/reference.html ) код:
var c = R.circle(100, 100, 50).attr({
fill: "hsb(.8, 1, 1)",
stroke: "none",
opacity: .5
});
var start = function () {
// storing original coordinates
this.ox = this.attr("cx");
this.oy = this.attr("cy");
this.attr({opacity: 1});
},
move = function (dx, dy) {
// move will be called with dx and dy
this.attr({cx: this.ox dx, cy: this.oy dy});
},
up = function () {
// restoring state
this.attr({opacity: .5});
};
c.drag(move, start, up);
теперь…
у меня есть функция перемещения RaphaelJS. у меня есть функция переопределения правого меню javascript. я хочу объединить эти две функции. как я могу сделать?
если у вас есть какие-либо идеи. оставьте свой ответ. Большое вам спасибо.
кстати:
если в исходном коде есть какая-то ошибка, также можно указать, что
Ответ №1:
$(c.node).bind("contextmenu", function(){
alert(0);
});
Пожалуйста, попробуйте приведенный выше код, $ == jQuery.
Ответ №2:
Вот как вы могли бы добавить контекстное меню к элементу svg с помощью DOJO. Оно появится при щелчке правой кнопкой мыши.
var contextMenu = new dijit.Menu();
contextMenu.addChild(
new dijit.MenuItem( {
label:"Menu item",
onClick:function(e){ log.debug("Clicked"); }
}));
contextMenu.bindDomNode(raphaelElement[0] );
RaphaelElement — это ваш элемент raphael, подобный кругу или эллипсу.