$("*").click(function(){
$(this); // how can I get selector from $(this) ?
});
এর থেকে নির্বাচক পাওয়ার$(this)
সহজ উপায় কি আছে ? তার নির্বাচকের দ্বারা কোনও উপাদান নির্বাচন করার উপায় রয়েছে, তবে উপাদান থেকে নির্বাচককে পাওয়ার কী ?
$("*").click(function(){
$(this); // how can I get selector from $(this) ?
});
এর থেকে নির্বাচক পাওয়ার$(this)
সহজ উপায় কি আছে ? তার নির্বাচকের দ্বারা কোনও উপাদান নির্বাচন করার উপায় রয়েছে, তবে উপাদান থেকে নির্বাচককে পাওয়ার কী ?
উত্তর:
ঠিক আছে, সুতরাং উপরের মন্তব্যে প্রশ্নকারী জিজ্ঞাসাবাদী Fidilip
বলেছেন যে সে / সে আসলে কী তা হ'ল বর্তমান উপাদানটির পথ অর্জন করা।
এখানে একটি স্ক্রিপ্ট যা DOM পূর্বপুরুষের গাছটিকে "আরোহণ" করবে এবং তারপরে ক্লিক করা আইটেমের কোনও id
বা class
বৈশিষ্ট্য সহ মোটামুটি নির্দিষ্ট নির্বাচক তৈরি করবে।
এটি jsFizz এ কাজ করে দেখুন: http://jsfiddle.net/Jkj2n/209/
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function() {
$("*").on("click", function(e) {
e.preventDefault();
var selector = $(this)
.parents()
.map(function() { return this.tagName; })
.get()
.reverse()
.concat([this.nodeName])
.join(">");
var id = $(this).attr("id");
if (id) {
selector += "#"+ id;
}
var classNames = $(this).attr("class");
if (classNames) {
selector += "." + $.trim(classNames).replace(/\s/gi, ".");
}
alert(selector);
});
});
</script>
</head>
<body>
<h1><span>I love</span> jQuery</h1>
<div>
<p>It's the <strong>BEST THING</strong> ever</p>
<button id="myButton">Button test</button>
</div>
<ul>
<li>Item one
<ul>
<li id="sub2" >Sub one</li>
<li id="sub2" class="subitem otherclass">Sub two</li>
</ul>
</li>
</ul>
</body>
</html>
উদাহরণস্বরূপ, আপনি যদি নীচের এইচটিএমএলে ২ য় তালিকার নেস্টেড তালিকা আইটেমটি ক্লিক করেন তবে আপনি নীচের ফলাফল পাবেন:
HTML>BODY>UL>LI>UL>LI#sub2.subitem.otherclass
join(" > ");
, আমাকে তাত্ক্ষণিক শিশু এবং তাই আরও কঠোর পথ পাবে।
গতকাল তার কোডটি খনন করার সময় jQuery অবজেক্টের একটি নির্বাচক সম্পত্তি রয়েছে। এটি ডক্সে সংজ্ঞায়িত করা হয়েছে কিনা তা কতটা নির্ভরযোগ্য তা জানেন না (ভবিষ্যতের প্রমাণের জন্য)। কিন্তু এটি কাজ করে!
$('*').selector // returns *
সম্পাদনা : আপনি যদি ইভেন্টটির অভ্যন্তরে নির্বাচককে খুঁজে পান তবে সেই তথ্যটি আদর্শভাবেই ইভেন্টের অংশ হওয়া উচিত এবং উপাদান হিসাবে নয় কারণ কোনও উপাদানটিতে বিভিন্ন নির্বাচকদের মাধ্যমে একাধিক ক্লিক ইভেন্ট নির্ধারিত হতে পারে। একটি সমাধান প্রায় করার জন্য একটি মোড়কের ব্যবহার করতে হবে bind()
, click()
ইত্যাদি এটা সরাসরি যোগ করার পরিবর্তে ঘটনা যোগ করতে।
jQuery.fn.addEvent = function(type, handler) {
this.bind(type, {'selector': this.selector}, handler);
};
নির্বাচিত কোনও বস্তুর সম্পত্তি হিসাবে সম্পত্তি হিসাবে পাস করা হচ্ছে selector
। এটি হিসাবে অ্যাক্সেস করুন event.data.selector
।
আসুন এটি কয়েকটি মার্কআপে চেষ্টা করে দেখুন ( http://jsfiddle.net/DFh7z/ ):
<p class='info'>some text and <a>a link</a></p>
$('p a').addEvent('click', function(event) {
alert(event.data.selector); // p a
});
দাবি অস্বীকার : মনে রাখবেন যে live()
ইভেন্টগুলির মতোই , ডিওএম ট্র্যাভারসাল পদ্ধতি ব্যবহার করা হলে নির্বাচক সম্পত্তি অবৈধ হতে পারে।
<div><a>a link</a></div>
নীচের কোডটি কার্যকর করবে না, যেমন live
নির্বাচক সম্পত্তির উপর নির্ভর করে যা এই ক্ষেত্রে a.parent()
- একটি অবৈধ নির্বাচনকারী।
$('a').parent().live(function() { alert('something'); });
আমাদের addEvent
পদ্ধতিটি জ্বলে উঠবে, তবে আপনিও ভুল নির্বাচক দেখতে পাবেন - a.parent()
।
No Such jQuery Method Exists
@ ড্রজাউসের সহযোগিতায় আমরা নীচের জিকুয়েরি প্লাগইন নিয়ে এসেছি।
!(function ($, undefined) {
/// adapted http://jsfiddle.net/drzaus/Hgjfh/5/
var get_selector = function (element) {
var pieces = [];
for (; element && element.tagName !== undefined; element = element.parentNode) {
if (element.className) {
var classes = element.className.split(' ');
for (var i in classes) {
if (classes.hasOwnProperty(i) && classes[i]) {
pieces.unshift(classes[i]);
pieces.unshift('.');
}
}
}
if (element.id && !/\s/.test(element.id)) {
pieces.unshift(element.id);
pieces.unshift('#');
}
pieces.unshift(element.tagName);
pieces.unshift(' > ');
}
return pieces.slice(1).join('');
};
$.fn.getSelector = function (only_one) {
if (true === only_one) {
return get_selector(this[0]);
} else {
return $.map(this, function (el) {
return get_selector(el);
});
}
};
})(window.jQuery);
// http://stackoverflow.com/questions/2420970/how-can-i-get-selector-from-jquery-object/15623322#15623322
!function(e,t){var n=function(e){var n=[];for(;e&&e.tagName!==t;e=e.parentNode){if(e.className){var r=e.className.split(" ");for(var i in r){if(r.hasOwnProperty(i)&&r[i]){n.unshift(r[i]);n.unshift(".")}}}if(e.id&&!/\s/.test(e.id)){n.unshift(e.id);n.unshift("#")}n.unshift(e.tagName);n.unshift(" > ")}return n.slice(1).join("")};e.fn.getSelector=function(t){if(true===t){return n(this[0])}else{return e.map(this,function(e){return n(e)})}}}(window.jQuery)
<html>
<head>...</head>
<body>
<div id="sidebar">
<ul>
<li>
<a href="/" id="home">Home</a>
</li>
</ul>
</div>
<div id="main">
<h1 id="title">Welcome</h1>
</div>
<script type="text/javascript">
// Simple use case
$('#main').getSelector(); // => 'HTML > BODY > DIV#main'
// If there are multiple matches then an array will be returned
$('body > div').getSelector(); // => ['HTML > BODY > DIV#main', 'HTML > BODY > DIV#sidebar']
// Passing true to the method will cause it to return the selector for the first match
$('body > div').getSelector(true); // => 'HTML > BODY > DIV#main'
</script>
</body>
</html>
$.map
* veragesচ্ছিক ডিলিমিটার (অদ্ভুত খালি ট্যাগনামগুলি স্ট্রিপ করা দরকার) * নিরাপদ থাকার জন্য আপনার hasOwnProperty
কোনও foreach
লুপ পরীক্ষা করার দরকার নেই ?
' > '
কারণে এটি উপাদানটির নির্বাচককে না ফেরায়।
আমি একটি jQuery প্লাগইন প্রকাশ করেছি: jQuery নির্বাচনকারী , আপনি এটির মতো নির্বাচক পেতে পারেন।
$("*").on("click", function(){
alert($(this).getSelector().join("\n"));
return false;
});
এটা চেষ্টা কর:
$("*").click(function(event){
console.log($(event.handleObj.selector));
});
এইভাবে $ ফাংশনটির উপরে কেবল একটি স্তর যুক্ত করুন:
$ = (function(jQ) {
return (function() {
var fnc = jQ.apply(this,arguments);
fnc.selector = (arguments.length>0)?arguments[0]:null;
return fnc;
});
})($);
এখন আপনি ভালো জিনিস করতে পারেন
$ ( "একটি")। নির্বাচকএবং আরও নতুন jQuery সংস্করণে "একটি" ফিরিয়ে দেবে।
http://www.selectorgadget.com/ একটি বুকমার্কলেট যা এই ব্যবহারের ক্ষেত্রে সুস্পষ্টভাবে ডিজাইন করা হয়েছে।
এটি বলেছিল, আমি বেশিরভাগ অন্যান্য ব্যক্তির সাথে একমত যে আপনার নিজেরাই সিএসএস নির্বাচনকারীদের শিখতে হবে, কোড সহ তাদের তৈরি করার চেষ্টা করা টেকসই নয়। :)
আমি @ জেসেগাভিনের ফিক্সে কিছু সংশোধন করেছি।
উপাদানটিতে কোনও আইডি থাকলে এই মুহুর্তে ফিরে আসবে। কোনও উপাদানের আইডি, শ্রেণি বা নাম না থাকলে আমি একটি নাম গুণবাচক চেক এবং একটি নবম শিশু নির্বাচকও যুক্ত করেছি।
পৃষ্ঠায় একাধিক ফর্ম এবং অনুরূপ ইনপুট থাকতে পারে নামটির জন্য স্কোপিংয়ের প্রয়োজন হতে পারে তবে আমি এখনও এটি পরিচালনা করি নি।
function getSelector(el){
var $el = $(el);
var id = $el.attr("id");
if (id) { //"should" only be one of these if theres an ID
return "#"+ id;
}
var selector = $el.parents()
.map(function() { return this.tagName; })
.get().reverse().join(" ");
if (selector) {
selector += " "+ $el[0].nodeName;
}
var classNames = $el.attr("class");
if (classNames) {
selector += "." + $.trim(classNames).replace(/\s/gi, ".");
}
var name = $el.attr('name');
if (name) {
selector += "[name='" + name + "']";
}
if (!name){
var index = $el.index();
if (index) {
index = index + 1;
selector += ":nth-child(" + index + ")";
}
}
return selector;
}
উপরের সমাধানের পরেও আমি একাধিক উপাদান পাচ্ছিলাম, তাই আমি আরও পিন-পয়েন্টিং ডোম উপাদানটির জন্য dds1024 কাজ বাড়িয়েছি।
যেমন ডিআইভি: নবম-সন্তান (1) ডিআইভি: নবম-শিশু (3) ডিআইভি: নবম-সন্তান (1) নিবন্ধ: নবম-সন্তান (1) ডিআইভি: নবম-শিশু (1) ডিআইভি: নবম-সন্তান (8) ডিআইভি : নবম-সন্তান (২) ডিআইভি: নবম-শিশু (1) ডিআইভি: নবম-সন্তান (2) ডিআইভি: নবম-শিশু (1) এইচ 4: নবম-শিশু (2)
কোড:
function getSelector(el)
{
var $el = jQuery(el);
var selector = $el.parents(":not(html,body)")
.map(function() {
var i = jQuery(this).index();
i_str = '';
if (typeof i != 'undefined')
{
i = i + 1;
i_str += ":nth-child(" + i + ")";
}
return this.tagName + i_str;
})
.get().reverse().join(" ");
if (selector) {
selector += " "+ $el[0].nodeName;
}
var index = $el.index();
if (typeof index != 'undefined') {
index = index + 1;
selector += ":nth-child(" + index + ")";
}
return selector;
}
এটি আপনাকে ক্লিক করা এইচটিএমএল উপাদানগুলির নির্বাচক পথ পেতে পারে-
$("*").on("click", function() {
let selectorPath = $(this).parents().map(function () {return this.tagName;}).get().reverse().join("->");
alert(selectorPath);
return false;
});
ঠিক আছে, আমি এই সহজ jQuery প্লাগইন লিখেছি।
এটি আইডি বা শ্রেণীর নাম পরীক্ষা করে এবং যথাসম্ভব যথাযথ নির্বাচক দেওয়ার চেষ্টা করে।
jQuery.fn.getSelector = function() {
if ($(this).attr('id')) {
return '#' + $(this).attr('id');
}
if ($(this).prop("tagName").toLowerCase() == 'body') return 'body';
var myOwn = $(this).attr('class');
if (!myOwn) {
myOwn = '>' + $(this).prop("tagName");
} else {
myOwn = '.' + myOwn.split(' ').join('.');
}
return $(this).parent().getSelector() + ' ' + myOwn;
}
আপনি কি ক্লিক করা বর্তমান ট্যাগটির নাম পাওয়ার চেষ্টা করছেন?
যদি তাই হয় তবে এটি করুন ..
$("*").click(function(){
alert($(this)[0].nodeName);
});
আপনি সত্যই "নির্বাচক" পেতে পারেন না, আপনার ক্ষেত্রে "নির্বাচক" *
।
এটির জন্য জাভাস্ক্রিপ্ট কোড, যদি কারওর প্রয়োজন হয় তবে আমার এটির প্রয়োজন হয়। এটি কেবল উপরের নির্বাচিত উত্তরের কেবল অনুবাদ।
<script type="text/javascript">
function getAllParents(element){
var a = element;
var els = [];
while (a && a.nodeName != "#document") {
els.unshift(a.nodeName);
a = a.parentNode;
}
return els.join(" ");
}
function getJquerySelector(element){
var selector = getAllParents(element);
/* if(selector){
selector += " " + element.nodeName;
} */
var id = element.getAttribute("id");
if(id){
selector += "#" + id;
}
var classNames = element.getAttribute("class");
if(classNames){
selector += "." + classNames.replace(/^\s+|\s+$/g, '').replace(/\s/gi, ".");
}
console.log(selector);
alert(selector);
return selector;
}
</script>
কিছু উত্তর গ্রহণ করে এখানে পড়ুন আমি এটি প্রস্তাব করতে চাই:
function getSelectorFromElement($el) {
if (!$el || !$el.length) {
return ;
}
function _getChildSelector(index) {
if (typeof index === 'undefined') {
return '';
}
index = index + 1;
return ':nth-child(' + index + ')';
}
function _getIdAndClassNames($el) {
var selector = '';
// attach id if exists
var elId = $el.attr('id');
if(elId){
selector += '#' + elId;
}
// attach class names if exists
var classNames = $el.attr('class');
if(classNames){
selector += '.' + classNames.replace(/^\s+|\s+$/g, '').replace(/\s/gi, '.');
}
return selector;
}
// get all parents siblings index and element's tag name,
// except html and body elements
var selector = $el.parents(':not(html,body)')
.map(function() {
var parentIndex = $(this).index();
return this.tagName + _getChildSelector(parentIndex);
})
.get()
.reverse()
.join(' ');
if (selector) {
// get node name from the element itself
selector += ' ' + $el[0].nodeName +
// get child selector from element ifself
_getChildSelector($el.index());
}
selector += _getIdAndClassNames($el);
return selector;
}
একটি jQuery প্লাগইন তৈরি করতে দরকারী?
ধন্যবাদ p1nox!
আমার সমস্যাটি ছিল এমন একটি অজ্যাক্স কলটিতে ফর্ম ফোকাস করা যা ফর্মটির অংশটি পরিবর্তন করেছিল ifying
$.ajax({ url : "ajax_invite_load.php",
async : true,
type : 'POST',
data : ...
dataType : 'html',
success : function(html, statut) {
var focus = $(document.activeElement).getSelector();
$td_left.html(html);
$(focus).focus();
}
});
আমার কেবলমাত্র jQuery প্লাগইনে আপনার ফাংশনটি encapsulate করা প্রয়োজন:
!(function ($, undefined) {
$.fn.getSelector = function () {
if (!this || !this.length) {
return ;
}
function _getChildSelector(index) {
if (typeof index === 'undefined') {
return '';
}
index = index + 1;
return ':nth-child(' + index + ')';
}
function _getIdAndClassNames($el) {
var selector = '';
// attach id if exists
var elId = $el.attr('id');
if(elId){
selector += '#' + elId;
}
// attach class names if exists
var classNames = $el.attr('class');
if(classNames){
selector += '.' + classNames.replace(/^\s+|\s+$/g, '').replace(/\s/gi, '.');
}
return selector;
}
// get all parents siblings index and element's tag name,
// except html and body elements
var selector = this.parents(':not(html,body)')
.map(function() {
var parentIndex = $(this).index();
return this.tagName + _getChildSelector(parentIndex);
})
.get()
.reverse()
.join(' ');
if (selector) {
// get node name from the element itself
selector += ' ' + this[0].nodeName +
// get child selector from element ifself
_getChildSelector(this.index());
}
selector += _getIdAndClassNames(this);
return selector;
}
})(window.jQuery);
এটি আপনাকে ডোম পাথটি প্রদর্শন করবে না, তবে কোনও বস্তু দেখার সময় এটি উদাহরণস্বরূপ ক্রোম ডিবাগারটি যা দেখবে তার একটি স্ট্রিং প্রতিনিধিত্ব করে।
$('.mybtn').click( function(event){
console.log("%s", this); // output: "button.mybtn"
});
https://developer.chrome.com/devtools/docs/console-api#consolelogobject-object
কেমন:
var selector = "*"
$(selector).click(function() {
alert(selector);
});
আমি বিশ্বাস করি না যে jQuery স্টোরকারী নির্বাচিত পাঠ্যটি ব্যবহৃত হয়েছিল। সর্বোপরি, আপনি যদি এমন কিছু করেন তবে কীভাবে এটি কাজ করবে:
$("div").find("a").click(function() {
// what would expect the 'selector' to be here?
});
$('div').find('a').selector
হয় div a
। যদি ইভেন্টগুলি jQuery ফাংশনগুলির মাধ্যমে তৈরি না করা হয় তবে তার পরিবর্তে একটি মোড়ক তৈরি হয় তবে আমি বিশ্বাস করি যে ইভেন্ট হ্যান্ডলারের কাছে ডেটা আর্গুমেন্ট হিসাবে নির্বাচককে পাস করা যেতে পারে।