2013-04-03 29 views
7

jQuery ile bir özel bağlam menüsü konumlandırmaya çalışıyorum.
İlk kez doğru konumda (fare koordinatları) belirir, ancak geçerli konum yeni konumla toplanır, böylece menü ekrandan kaybolur.
İşte JavaScript'tir:Konumlandırma İçeriği Menüsü

<script> 
$(function(){ 
    $('#box').hide(); 

    $(document).bind("contextmenu", function(e) { 
     $("#box").offset({left:e.pageX, top:e.pageY}); 
     $('#box').show(); 
     e.preventDefault(); 
    }); 

    $(document).bind("click", function(e) { 
     $('#box').hide(); 
    }); 
    $('#box').bind("click", function(e) { 
     $('#box').hide(); 
    }); 
}); 
</script> 
+0

, [ '.sistem()'] (http://api.jquery.com/on) 'üstlenilmekle jQuery'nin son sürümlerinde .bind() '. – Blazemonger

cevap

8

offset yöntemini kullanmayın, denemek css yerine, konumlandırma içerik menüsü kesinlikle:

$("#box").css({left:e.pageX, top:e.pageY}); 

CSS:

#box { 
    ... 
    position: absolute; 
} 

http://jsfiddle.net/smxLk/

+0

Aslında bunu daha iyi seviyorum. CSS'yi doğru bir şekilde anlamak ve buna göre ayarlamak her zaman jQuery'yi kullanmamdan daha iyi olacaktır, fakat ben bir kez daha bir ödeme yapacağım. Mutlak yerine 'sabit' kullanırdım. Bu şekilde, statik olmayan bir ebeveyn tarafından etkilenemez ve kaydırma çubuklarına neden olmaz. –

+1

@JosephMarikle 'position: fixed' kullanılarak, bağlam menüsü garip bir şekilde davranır: http: //jsfiddle.net/smxLk/1/ uzun sayfa içeriğine sahip sayfada. 'pozisyon: mutlak 'iyi çalışıyor: http://jsfiddle.net/smxLk/2/. Ayrıca, göstermeden önce, menünün ekrandan çıkıp çıkmadığını kontrol etmemiz gerektiğini ve pozisyonunu sabit bir şekilde sabitleyeceğimizi düşünüyorum. Aksi takdirde menü kırpılmışsa anlam ifade etmemektedir. – dfsq

+0

İyi puanlar. "Position: fixed" ile ilerlediğinizde bir noktada kalacağımı unuttum. XD –

4

Sorun şu ki sağ tıkladıktan sonra başka bir yere tıkladıktan sonra tekrar sağ tıkladığınızda pozisyon yanlış.

Sorunun kökü, öğeyi göstermeden önce ofseti ayarlamanızdır. Öğe display:none olarak ayarlanmışsa jQuery ile karıştırılır ve sonra ofset değiştirilir.

kodunuzda show ve offset hatları geçiş için gereken sorunu çözmek için:

$(document).bind("contextmenu", function(e) { 
    $("#box").offset({left:e.pageX, top:e.pageY}); 
    $('#box').show(); 
    e.preventDefault(); 
}); 

$(document).bind("contextmenu", function(e) { 
    $('#box').show(); 
    $("#box").offset({left:e.pageX, top:e.pageY}); 
    e.preventDefault(); 
}); 

Demo
ve
Source

+0

Bu, jQuery'de bir hata mı? – Blazemonger

+0

@Blazemonger Belki de. Bununla birlikte, bunun düzeltileceğinden emin değilim, çünkü gizli bir unsurun ofsetini değiştirmek gerçekten mantıklı değil. Ama maalesef senin için kesin bir cevabım yok –

0

deneyin pozisyonunu haline gelir: sabit; Aşağıdaki durumuna göre içerik menüsü değişikliklerin konumu ile - Bu arada

var windowHeight = $(window).height()/2; 
var windowWidth = $(window).width()/2; 
if(e.clientY > windowHeight && e.clientX <= windowWidth) { 
    $("#contextMenuContainer").css("left", e.clientX); 
    $("#contextMenuContainer").css("bottom", $(window).height()-e.clientY); 
    $("#contextMenuContainer").css("right", "auto"); 
    $("#contextMenuContainer").css("top", "auto"); 
} else if(e.clientY > windowHeight && e.clientX > windowWidth) { 
    $("#contextMenuContainer").css("right", $(window).width()-e.clientX); 
    $("#contextMenuContainer").css("bottom", $(window).height()-e.clientY); 
    $("#contextMenuContainer").css("left", "auto"); 
    $("#contextMenuContainer").css("top", "auto"); 
} else if(e.clientY <= windowHeight && e.clientX <= windowWidth) { 
    $("#contextMenuContainer").css("left", e.clientX); 
    $("#contextMenuContainer").css("top", e.clientY); 
    $("#contextMenuContainer").css("right", "auto"); 
    $("#contextMenuContainer").css("bottom", "auto"); 
} else { 
    $("#contextMenuContainer").css("right", $(window).width()-e.clientX); 
    $("#contextMenuContainer").css("top", e.clientY); 
    $("#contextMenuContainer").css("left", "auto"); 
    $("#contextMenuContainer").css("bottom", "auto"); 
} 

http://jsfiddle.net/AkshayBandivadekar/zakn7Lwb/14/