Javascript JIRA 扩展在悬停时不工作

Javascript JIRA Extension not working on hover

我开发了一些 Javascript 示例,当您将鼠标悬停在问题-link。主要用于问题搜索页面,防止连续右击->在新标签中打开->检查...变得极其繁琐,但也可用于大多数其他问题links.

它的目的是在 link 悬停时工作,但它并不总是按计划进行。当我第一次将鼠标悬停在任何问题 link 上时,它会生成一个工具提示 'undefined'。当我第二次将鼠标悬停在 ANY issue-link 上时,它会按预期生成准确的工具提示。将它复制到您的控制台,我很确定您会看到相同的行为。

我不是 Javascript 大师,所以我可能不知道 Javascript 的机制,所以如果有人知道为什么会发生这种情况,请告诉我!

我也把它打包成JIRA插件,看到了同样的结果。

AJS.toInit(function () {

var url,
issue_id,
offset,
x,
y,
jira_data,
html,
fixVersions,
assignee,
domain = document.location;

// build url whatever it might be
url = domain.protocol +'//'+ domain.hostname
if (domain.port !== "") {
    url += ':'+domain.port
}

AJS.$(".issue-link, td.issuelinks > a, #ghx-issues-in-epic-table > tbody > tr > td > a").tooltip({

    title: function () {

        // GETS THE ISSUE ID FROM THE HREF ELEMENT
        issue_id = (AJS.$(this).attr("href")).slice((AJS.$(this).attr("href")).lastIndexOf("/"), (AJS.$(this).attr("href")).length);
        // QUERIES JIRA API - ALREADY AUTHENTICATED WITH SESSION
        jira_data = AJS.$.getJSON(url+'/rest/api/2/issue' + issue_id, function (json) {

        })
            // AJAX COMPLETE FUNCTION
            jira_data.done(function (jira_data) {
            // CHECK FOR FixVersoin and Multiple FixVersions
            fixVersions = ""
            if (jira_data['fields']['fixVersions'] === undefined) {
                fixVersions = "None";
            } else {
            AJS.$.each(jira_data['fields']['fixVersions'], function(index, value) {
                fixVersions += value['name'] + " ";
            });};
            // CHECK FOR UNASSIGNED
            if (jira_data['fields']['assignee'] === undefined) {
                assignee = "Unassigned";
            } else {
                assignee = jira_data['fields']['assignee']['displayName'];
            };            
            // BUILD STRING OUTPUT
            html = "<span style='text-align:left'>";
            html += "<strong>Status: </strong>" + jira_data['fields']['status']['name'] + "</br>"
            html +="<strong>Assignee: </strong>" + assignee + "</br>";
            html += "<strong>Fix Version:  </strong>" +fixVersions+ "</br>";
            html += "<strong>Summary: </strong>" + jira_data['fields']['summary'];
            html += "</span>"

        });
        return html;
    }, live: true, gravity: AJS.$.fn.tipsy.autoWE, html:true, delayIn: 400, delayOut: 50});


        // REMOVE TITLE TAG TO PREVENT OBSTURCTION
AJS.$(".issue-link, td.issuelinks > a, #ghx-issues-in-epic-table > tbody > tr > td > a").removeAttr('title');    
AJS.$(".issue-link, td.issuelinks > a, #ghx-issues-in-epic-table > tbody > tr > td > a").parent().removeAttr('title');

});

问题(或至少 "a" 问题)是您在收到鼠标悬停事件之前没有将工具提示附加到 link。附加工具提示后,工具提示库 then 开始寻找鼠标悬停事件。如果您在添加工具提示时已经将鼠标悬停在元素上,则尚不清楚这将如何工作,这让我认为它与问题有关。 无论如何,您不想重新初始化每次用户将鼠标悬停在 link.

上时的工具提示处理程序

你需要喝醉 live-type events。在那种情况下,您不附加自己的鼠标悬停处理程序,而是让工具提示库处理它。你想要这样的东西:

再次阅读您的问题以及您在下面的评论,表明您想要一种不同于我最初建议的方法。由于 Tipsy 似乎没有原生 AJAX 支持,您需要返回到更接近您最初编写的内容。

目标是为每个 link 附加一个实时处理程序,并查看 link 是否已被注释为微不足道的工具提示。如果没有,您需要执行 AJAX 调用来获取数据。 AJAX 调用返回后,您才想附上醉意的工具提示。

这假设当您已经将鼠标悬停在某个元素上并添加工具提示时,tipsy 会正确处理这种情况,然后使其立即呈现工具提示。从你原来的 post 来看,这听起来像是因为你得到了 'undefined'.

换句话说,是这样的:

AJS.$(document).on("mouseover", ".issue-link, td.issuelinks > ...etc...")(function(e) {
    var $el = AJS.$(e.currentTarget);

    // Attach an attribute so that we only do this once per element:

    if ($el.attr('data-has-tipsy') === 'yes') {
         return; // already handled
    }

    $el.attr('data-has-tipsy', 'yes');

    // Now call your code to get the issue data here.
    // issue_id = ...
    // jira_data = ...

    jira_data.done(function (jira_data) {

        // calculate html here
        var html = 'Hello, Bob';

        // Finally, attach the tooltip within the done function!
        $el.tooltip({title: html, gravity: 'n', html: true, ...});
    }
}

我重构了你的代码,它工作正常。诀窍是在 ajax 回调函数中填充工具提示。

AJS.toInit(function () {

var url,
issue_id,
offset,
x,
y,
jira_data,
html,
fixVersions,
assignee,
domain = document.location;

// build url whatever it might be
url = domain.protocol +'//'+ domain.hostname
if (domain.port !== "") {
    url += ':'+domain.port
}

AJS.$(".issue-link, td.issuelinks > a, #ghx-issues-in-epic-table > tbody > tr > td > a").hover(function () {

         console.log('Entro')
        // GETS THE ISSUE ID FROM THE HREF ELEMENT
        issue_id = (AJS.$(this).attr("href")).slice((AJS.$(this).attr("href")).lastIndexOf("/"), (AJS.$(this).attr("href")).length);
        // QUERIES JIRA API - ALREADY AUTHENTICATED WITH SESSION

        jira_data = AJS.$.getJSON(url+'/rest/api/2/issue' + issue_id, function (json) {

        })
            // AJAX COMPLETE FUNCTION
            jira_data.done(function (jira_data) {
            // CHECK FOR UNASSIGNED
            if (jira_data['fields']['assignee'] === undefined) {
                assignee = "Unassigned";
            } else {
                assignee = jira_data['fields']['assignee']['displayName'];
            };            
            // BUILD STRING OUTPUT
            html = "<span style='text-align:left'>";
            html += "<strong>Summary: </strong>" + jira_data['fields']['summary'] + "</br>";
            html += "<strong>Status: </strong>" + jira_data['fields']['status']['name'] + "</br>";
            html +="<strong>Asignado: </strong>" + assignee + "</br>";
            html += "</span>";
            AJS.$(".issue-link, td.issuelinks > a, #ghx-issues-in-epic-table > tbody > tr > td > a").removeAttr('title');    
   AJS.$(".issue-link, td.issuelinks > a, #ghx-issues-in-epic-table > tbody > tr > td > a").parent().removeAttr('title');
            AJS.$(".issue-link, td.issuelinks > a, #ghx-issues-in-epic-table > tbody > tr > td > a").tooltip({title:function () {
        return html;
    },live: true, gravity: AJS.$.fn.tipsy.autoWE, html:true, delayIn: 400, delayOut: 50});
        });
});
});