作業中のプロジェクトでTwitterのBootstrap「Collapse」プラグインを使用しています。単純なアコーディオン(ドキュメントに従って設定)がありますが、デフォルトの機能をクリック時からホバー時のイベントに修正したいと思います。
誰かがこれを達成するための最良の方法を確認できますか?
作業中のプロジェクトでTwitterのBootstrap「Collapse」プラグインを使用しています。単純なアコーディオン(ドキュメントに従って設定)がありますが、デフォルトの機能をクリック時からホバー時のイベントに修正したいと思います。
誰かがこれを達成するための最良の方法を確認できますか?
「クリック可能性」をかなり簡単に維持しながら、ホバー機能を実現しました。
jQuery(".pointer").hover(
function(){
var thisdiv = jQuery(this).attr("data-target")
jQuery(thisdiv).collapse("show");
},
function(){
var thisdiv = jQuery(this).attr("data-target")
jQuery(thisdiv).collapse("hide");
}
);
私はすでにデータ属性を使用していたので、それらを保持し、ここでそれらを使用して適切なdivをトリガーしました。「ポインタ」は私のトグルリンクのクラスなので、必要に応じて調整できます。
折りたたみ可能なdata-apiをプラグインスクリプトから直接コピーし、それを微調整してホバー機能を実現できます。次に、それを独自のscript.jsファイル内に配置し、変更する折りたたみ可能オブジェクトをターゲットにして、クリックではなくホバーで開くことができます。たとえば、これを試してください。
JS
$(function() {
$('#accordion2').on('mouseenter.collapse.data-api', '[data-toggle=collapse]', function(e) {
var $this = $(this),
href, target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
,
option = $(target).data('collapse') ? 'show' : $this.data()
$(target).collapse(option)
})
})
これは、プラグインにあるdata-apiブロックの直接コピーです。click
イベントをmouseenter
オプションに置き換えただけで、代わりcollapse
にに変更しましshow
た。
デモ: http: //jsfiddle.net/um2q2/1/
次のスクリプトを追加します
$( ".hoverExpand" ).hover(
function() {
if (! $(this).hasClass('collapsing') &&
$(this).hasClass('collapsed')) {
$( this ).click();
}
}, function() {
if (! $(this).hasClass('collapsing') ||
! $(this).hasClass('collapsed')) {
$( this ).click();
}
}
);
hoverExpand
要素に(またはあなたがそれを呼びたいものは何でも)追加します。以下の例を参照してください
<a class="hoverExpand" data-toggle="collapse" data-parent="#accordion"
href="#collapseOne">A plane that flies below water</a>
bootstrap3で動作させるために、いくつか変更を加えました
$(function() {
$(document).on('mouseenter.collapse', '[data-toggle=collapse]', function(e) {
var $this = $(this),
href,
target = $this.attr('data-target')
|| e.preventDefault()
|| (href = $this.attr('href'))
&& href.replace(/.*(?=#[^\s]+$)/, ''), //strip for ie7
option = $(target).hasClass('in') ? 'hide' : "show"
$('.panel-collapse').not(target).collapse("hide")
$(target).collapse(option);
})
});
私はパーティーに少し遅れていますが、将来のグーグルのために、私はこれを行うためのはるかに簡単な方法を思いつきました。
それは私が恐れているコーヒースクリプトです、しかしあなたは考えを得る必要があります:
$(".your-hoverable-object-class").mouseenter (e) ->
$this = $(this)
link = $this.find("a") #(assumes you only have one link)
target = link.attr('data-target') || e.preventDefault() || (href = link.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') #strip for ie7
unless $(target).hasClass('in')
link.trigger('click') #Here's the money shot - just trigger the default functionality
コードの残りの部分は変数を設定しています(設定方法によってはこれを微調整する必要がある場合があります)。最後のビットは、パネルがまだ開いていないことを確認してから、もう一度クリックをトリガーします。繰り返しますが、これは私の設定では機能しますが、機能しない場合は削除できます。
Cliff Sealの回答に基づいて、アニメーションが終了する前に発生しpanel-collapse
たときに開いたままにならないように、アニメーションをキューに入れることをお勧めします。mouseleave
collapse('show')
$('div.panel-collapse').on('shown.bs.collapse hidden.bs.collapse', function() {
$(this).dequeue('collapse');
});
$('div.panel-heading').hover(
function() {
var collapse = $($(this).find('a').attr('href'));
collapse.queue('collapse', function() {
$(this).collapse('show');
});
if (!collapse.hasClass('collapsing')) {
collapse.dequeue('collapse');
}
},
function() {
var collapse = $($(this).find('a').attr('href'));
collapse.queue('collapse', function() {
$(this).collapse('hide');
});
if (!collapse.hasClass('collapsing')) {
collapse.dequeue('collapse');
}
}
}
これはDRYコーディングを利用していませんが、名前付き関数を使用しているときにhover
イベントが発生しました。onload
多分誰かがこれについてアドバイスすることができますか?
これは、マウスオーバーでそれを行う最も簡単な方法です。angleJsでプレーンJavaScriptを使用します。
脚本
$scope.collapsePanel = function(variable) {
if(document.getElementById(variable).className=="collapse in") {
document.getElementById(variable).className="collapse";
document.getElementById(variable).setAttribute("aria-expanded","false");
} else {
document.getElementById(variable).className="collapse in";
document.getElementById(variable).setAttribute("aria-expanded","true");
}
}
HTMLコード
<div ng-repeat="entity in entities">
<div class="panel-heading" ng-mouseover="collapsePanel(entity)">
//Give your contents here
</div>
</div>
注:マウスオーバーではなくクリックで機能するように、ng-clickでng-mouseoverを変更します