2011-11-15 48 views
6

我創建了一個jQuery UI按鈕,並且想要在mouseenter事件中添加一個'X'輔助圖標,並在mouseleave事件中刪除'X'。聽起來很簡單。關於懸停更改jQuery UI的按鈕圖標 - 在IE和Chrome上破解

$("#hover").button({ 
icons: { 
    primary: "ui-icon-tag" 
} 
}).hover(function (event) { 
    // hover in   
    $(this).button("option", "icons", { primary: "ui-icon-tag", secondary: "ui-icon-close" }); 
}, function (event) { 
    // hover out 
    $(this).button("option", "icons", { primary: "ui-icon-tag" }); 
}); 

如果您在按鈕內移動鼠標光標,則會多次觸發懸停事件。

它可以在Firefox中使用,但是在IE和Chrome中失敗。

這是很難解釋的離奇效果的話,但請看到的jsfiddle這裏:

http://jsfiddle.net/27SSr/

我的目標是要實現在所有瀏覽器一致的效果。 感謝=)

編輯***

現在我有一些線索,爲什麼懸停在IE和Chrome打破。 懸停UI按鈕幾次,檢查在Firebug的按鈕元素, 原來的html標籤的jQuery UI部件有缺陷..

<button id="hover" class="ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-button-text-icons" role="button"> 
<span class="ui-button-icon-primary ui-icon ui-icon-tag"/> 
<span class="ui-button-text">Hover me!</span> 
<span class="ui-button-icon-secondary ui-icon ui-icon-close"/> 
</button> 
<span class="ui-button-icon-primary ui-icon ui-icon-tag"/> 
<span class="ui-button-text">Hover me!</span> 
<span class="ui-button-icon-secondary ui-icon ui-icon-close"/> 
</button> 

注意額外的跨越,現在按鈕關閉標籤? 這種行爲是一個jQuery UI的bug嗎?

你可以在這裏嘗試的例子:

http://jsfiddle.net/B5sAk/1/

回答

3

好做e.stop(),一會兒擺弄了之後,最後一個可行的解決辦法..在至少對我來說看起來不錯。

$("button").button({ 
    icons: { 
     primary: "ui-icon-tag", 
     secondary: "ui-icon-blank" 
    } 
}).hover(function() { 
    // hover in    
    $(".ui-button-icon-secondary", this).toggleClass("ui-icon-close ui-icon-blank"); 
}, function() { 
    // hover out 
    $(".ui-button-icon-secondary", this).toggleClass("ui-icon-close ui-icon-blank"); 
}); 

並添加一行到CSS:

.ui-icon-blank { background-position: -240px -224px; } /* point to blank area of sprite */ 

看到這裏的工作示例:http://jsfiddle.net/GCme2/4/

0

怎麼樣使用mouseentermouseleave事件,他們將只火一次每個。

訣竅是將按鈕封裝在包含元素中,並將鼠標事件附加到容器。這裏是the working jsfiddle

,代碼:

<span id="hover-container"> 
    <button id="hover">Hover me!</button> 
</span> 

$("#hover").button({ 
    icons: { 
     primary: "ui-icon-tag" 
    } 
}); 

$("#hover-container").mouseenter(function() { 
    $("#hover").button("option", "icons", { primary: "ui-icon-tag", secondary: "ui-icon-close" }); 
    prependMessage("entering #hover"); 
}); 

$("#hover-container").mouseleave(function() { 
     $("#hover").button("option", "icons", { primary: "ui-icon-tag" }); 
    prependMessage("leaving #hover"); 
}); 
+0

這是行不通的。試過了。事實上,在引擎蓋下,懸停使用mouseenter和mouseleave作爲事件處理函數,在那裏讀取。我有一種感覺,種族情況正在發生。它發生在你真的快速翱翔在按鈕上,並導致上面顯示的缺陷元素.. – Kagawa

+0

我正在作戰jsfiddle,但我認爲我更新的答案工程... – Jason

+0

它仍然是相同的,只適用於Firefox,失敗在Chrome和IE瀏覽器上。第二個圖標('X' - 十字形)在幾次快速懸停後不會被移除..也許你應該再試一次=) – Kagawa

1

爲什麼使用JavaScript?這是一項要求嗎?你可以使用css:hover psuedoclass?

.ui-button-text .myicon{background-image: url('/path/reg.jpg')} 
.ui-button-text .myicon:hover{background-image: url('/path/to.jpg')} 

如果你必須使用jQuery的,那麼我會說你需要每個後

...hover(function (event) { 
     // hover in   
     $(this).button("option", "icons", { primary: "ui-icon-tag", secondary: "ui-icon-close" }); 
     event.stop(); 
    }, function (event) { 
     // hover out 
     $(this).button("option", "icons", { primary: "ui-icon-tag" }); 
    event.stop(); 

}); 
+3

我不使用CSS僞類,因爲該按鈕是一個jQuery UI小部件。它允許使用選項向按鈕添加主要和次要圖標。此外,沒有event.stop()這樣的事情,但是如果你的意思是event.stopPropagation()我試過了,並沒有工作太 – Kagawa

+0

+ 1的CSS僞類的想法,讓我去與toggleClass ()解決方法 – Kagawa

+0

嗯,我不能說你的項目的jqui需要,但我只是看jqui作爲一個樣式表和一些助手js,你可以很容易地擴展與良好的CSS元素定位。 –