Я знаю, что это было давно, но я много раз видел этот вопрос, и я просто боролся с ним сам, поэтому я постараюсь ответить на него, даже если я, конечно, слишком поздно.
Ответ Арно был на самом деле правильным ответом, несмотря на то, что он был немного коротким.
Ваш первый фрагмент кода был правильным. Проблема заключается в mxGraph, а не в вашей реализации.
Проблема возникает, когда ваш график содержится в чем-то другом на вашей странице, потому что mxGraph добавляет всплывающую подсказку в тело вместо контейнера графика.
Чтобы избежать этого, вы можете переопределить функцию init() mxTooltipHandler следующим образом:
mxTooltipHandler.prototype.init = function() {
if (document.body != null) {
const container = document.getElementById("graphcontainer");
this.div = document.createElement("div");
this.div.className = "mxTooltip";
this.div.style.visibility = "hidden";
container.appendChild(this.div);
mxEvent.addGestureListeners(
this.div,
mxUtils.bind(this, function(evt) {
this.hideTooltip();
})
);
}
};
Здесь я использовал «graphcontainer», но использовал идентификатор вашего графического контейнера.
Это позволит отображать всплывающую подсказку. Но, скорее всего, он будет не в том месте. Чтобы избежать этого, я также отменил функцию сброса следующим образом:
mxTooltipHandler.prototype.reset = function(
me,
restart,
state
) {
if (!this.ignoreTouchEvents || mxEvent.isMouseEvent(me.getEvent())) {
this.resetTimer();
state = state != null ? state : this.getStateForEvent(me);
if (
restart &&
this.isEnabled() &&
state != null &&
(this.div == null || this.div.style.visibility == "hidden")
) {
var node = me.getSource();
if(!node.attributes.x){
return
}
var x = parseInt(node.attributes.x.nodeValue);
var y = parseInt(node.attributes.y.nodeValue);
var stateSource =
me.isSource(state.shape) || me.isSource(state.text);
this.thread = window.setTimeout(
mxUtils.bind(this, function() {
if (
!this.graph.isEditing() &&
!this.graph.popupMenuHandler.isMenuShowing() &&
!this.graph.isMouseDown
) {
var tip = this.graph.getTooltip(state, node, x, y);
this.show(tip, x, y);
this.state = state;
this.node = node;
this.stateSource = stateSource;
}
}),
this.delay
);
}
}
};
Я не уверен, что это лучший способ добиться этого, но это сработало для меня.
person
Schnaffon
schedule
19.11.2019