কীভাবে এটি jQuery এর সাথে সম্পর্কিত? আমি জানি যে গ্রন্থাগারটি অভ্যন্তরীণভাবে জাভাস্ক্রিপ্টের ফাংশন ব্যবহার করে, তবে যখনই এ জাতীয় সমস্যা দেখা দেয় তখন এটি ঠিক কী করার চেষ্টা করে?
কীভাবে এটি jQuery এর সাথে সম্পর্কিত? আমি জানি যে গ্রন্থাগারটি অভ্যন্তরীণভাবে জাভাস্ক্রিপ্টের ফাংশন ব্যবহার করে, তবে যখনই এ জাতীয় সমস্যা দেখা দেয় তখন এটি ঠিক কী করার চেষ্টা করে?
উত্তর:
এর অর্থ হল আপনি DOM গাছের এমন কোনও জায়গায় একটি ডোম নোড toোকানোর চেষ্টা করেছেন যেখানে এটি যেতে পারে না। আমি এটি দেখতে দেখা সবচেয়ে সাধারণ জায়গাটি সাফারিতে যা নিম্নলিখিতগুলির অনুমতি দেয় না:
document.appendChild(document.createElement('div'));
সাধারণত এটি কেবল একটি ভুল যেখানে এটির উদ্দেশ্য ছিল:
document.body.appendChild(document.createElement('div'));
বন্য দেখা অন্যান্য কারণ (মন্তব্য থেকে সংক্ষিপ্তিত):
<!doctype html>
আপনার ইনজেকশনের এইচটিএমএল যুক্ত করে বা এক্সএইচআর মাধ্যমে আনার সময় সামগ্রীর ধরণ নির্দিষ্ট করে)response.xml
যেখানে উপলব্ধ তা ব্যবহার করে এড়িয়ে চলুন । উদাহরণস্বরূপ,$(e).append(response.xml || $(response));
আপনি যদি কোনও জিকিউরি আজাক্স কল aj .জ্যাক্সের কারণে এই ত্রুটিটি পেয়ে থাকেন
তারপরে আপনাকে সার্ভার থেকে ডেটা টাইপ কী ফিরে আসবে তা নির্দিষ্ট করতে হবে । আমি এই সাধারণ সম্পত্তিটি ব্যবহার করে প্রতিক্রিয়াটিকে অনেক স্থির করেছি।
$.ajax({
url: "URL_HERE",
dataType: "html",
success: function(response) {
$('#ELEMENT').html(response);
}
});
বিশেষত jQuery এর সাহায্যে আপনি উপাদান তৈরি করার সময় এইচটিএমএল ট্যাগের চারপাশে যত্নশীলদের ভুলে গেলে আপনি এই সমস্যাটিতে চলে যেতে পারেন:
$("#target").append($("div").text("Test"));
এই ত্রুটিটি উত্থাপন করবে কারণ আপনি যা বোঝাতে চেয়েছিলেন তা ছিল
$("#target").append($("<div>").text("Test"));
এই ত্রুটিটি ঘটতে পারে যখন আপনি ডিওমে কোনও নোড invalidোকানোর চেষ্টা করেন যা অবৈধ এইচটিএমএল, যা কোনও ভুল বৈশিষ্ট্যের মতো সূক্ষ্ম কিছু হতে পারে, উদাহরণস্বরূপ:
// <input> can have a 'type' attribute
var $input = $('<input/>').attr('type', 'text');
$holder.append($input); // OK
// <div> CANNOT have a 'type' attribute
var $div = $('<div></div>').attr('type', 'text');
$holder.append($div); // Error: HIERARCHY_REQUEST_ERR: DOM Exception 3
@ কেলি নরটন তার উত্তরে ঠিক The browser thinks the HTML you are attempting to append is XML
বলেছেন যে এটি এবং পরামর্শ দেয় specifying the content type when fetching via XHR
।
এটি সত্য তবে আপনি কখনও কখনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করেন যা আপনি সংশোধন করতে যাচ্ছেন না। এটি আমার ক্ষেত্রে জিকুয়েরি ইউআই। তারপরে আপনার Content-Type
জাভাস্ক্রিপ্টের দিকে প্রতিক্রিয়া টাইপকে ওভাররাইড না করে প্রতিক্রিয়াতে ডান সরবরাহ করা উচিত । আপনার সেট Content-Type
করা text/html
এবং ভাল আছেন।
আমার ক্ষেত্রে, এটা ছিল সহজ পুনঃনামকরনের যেমন file.xhtml
করতে file.html
- অ্যাপ্লিকেশন সার্ভার বাক্সের বাইরে MIME প্রকারসমূহ ম্যাপিং কিছু এক্সটেনশন ছিল। যখন বিষয়বস্তু গতিশীল হয়, আপনি কোনওভাবে সামগ্রী প্রতিক্রিয়া সেট করতে পারেন (যেমন res.setContentType("text/html")
সার্লেট এপিআইতে)।
আপনি এই প্রশ্নগুলি দেখতে পারেন
অথবা
এএসপি.নেট বোতাম পোস্টব্যাকের সাথে jQuery ইউআই ডায়ালগ
উপসংহারটি হল
আপনি যখন ফাংশন সংযোজন ব্যবহার করার চেষ্টা করবেন তখন আপনার এই উদাহরণটির মতো নতুন ভেরিয়েবল ব্যবহার করা উচিত
jQuery(function() {
var dlg = jQuery("#dialog").dialog({
draggable: true,
resizable: true,
show: 'Transfer',
hide: 'Transfer',
width: 320,
autoOpen: false,
minHeight: 10,
minwidth: 10
});
dlg.parent().appendTo(jQuery("form:first"));
});
উপরের উদাহরণে, অ্যাপেনডো ফাংশনটি চালানোর জন্য var "dlg" ব্যবহার করুন। তারপরে ত্রুটি "HIERARCHY_REQUEST_ERR" আবার বের হবে না।
গুগল ক্রোম এক্সটেনশন সাইডউইকি ব্যবহার করার সময় আমি এই ত্রুটির মুখোমুখি হয়েছি। এটি অক্ষম করা আমার জন্য সমস্যাটি সমাধান করেছে।
আমি এখানে আরও একটি নির্দিষ্ট উত্তর যুক্ত করতে যাচ্ছি কারণ এটি উত্তরের জন্য ২ ঘন্টা অনুসন্ধান ছিল ...
আমি একটি নথিতে একটি ট্যাগ ইনজেকশনের চেষ্টা করছিলাম। এইচটিএমএল এর মত ছিল:
<map id='imageMap' name='imageMap'>
<area shape='circle' coords='55,28,5' href='#' title='1687.01 - 0 percentile' />
</map>
আপনি যদি লক্ষ্য করেন, ট্যাগটি পূর্ববর্তী উদাহরণে বন্ধ রয়েছে ( <area/>
)। এটি ক্রোম ব্রাউজারগুলিতে গৃহীত হয়নি। ডাব্লু 3 স্কুলগুলি মনে হয় এটি বন্ধ করা উচিত, এবং আমি এই ট্যাগটিতে অফিসিয়াল স্পেসটি খুঁজে পাইনি, তবে এটি নিশ্চিত যে এটি ক্রোমে কাজ করে না। ফায়ারফক্স তা গ্রহণ করা হবে না সঙ্গে <area/>
বা <area></area>
বা <area>
। ক্রোম অবশ্যই থাকা উচিত <area>
। আইই কিছু গ্রহণ করে।
যাইহোক, এই ত্রুটিটি কারণ এটি আপনার এইচটিএমএল সঠিক নয় can
আমি জানি যে এই থ্রেডটি পুরানো, তবে আমি সমস্যার আরও একটি কারণের মুখোমুখি হয়েছি যা অন্যরা সহায়ক হতে পারে। গুগল অ্যানালিটিক্স নিজেকে এইচটিএমএল মন্তব্যে যুক্ত করার চেষ্টা করে ত্রুটি পাচ্ছিলাম। আপত্তিজনক কোড:
document.documentElement.firstChild.appendChild(ga);
এটি ত্রুটি সৃষ্টি করছিল কারণ আমার প্রথম উপাদানটি একটি এইচটিএমএল মন্তব্য ছিল (যথা একটি ড্রিমউইভার টেম্পলেট কোড)।
<!-- #BeginTemplate "/Templates/default.dwt.php" -->
আমি আপত্তিজনক কোডটি এমন কিছুতে সংশোধন করেছি যা বুলেটপ্রুফ হিসাবে স্বীকৃত নয়, তবে আরও ভাল:
document.documentElement.firstChild.nodeType===1 ? document.documentElement.firstChild.appendChild(ga) : document.documentElement.lastChild.appendChild(ga);
ইন্টারনেট এক্সপ্লোরারের কোনও অন্য উইন্ডোতে নোড যুক্ত করার চেষ্টা করার সময় আপনি যদি এই সমস্যায় পড়ে থাকেন তবে নোডের পরিবর্তে নোডের অভ্যন্তরে এইচটিএমএল ব্যবহারের চেষ্টা করুন।
myElement.appendChild(myNode.html());
আইই অন্য উইন্ডোতে নোড যুক্ত করতে সমর্থন করে না।
আইইউ-তে আমার এই ত্রুটিটি ঘটেছিল যখন আমি উইন্ডো এ-র একটি ইতিমধ্যে বিদ্যমান একটিতে গতিশীলভাবে অ্যাপিলচিল্ড করার চেষ্টা করেছি এ উইন্ডো এ একটি শিশু উইন্ডো বি তৈরি করবে বি উইন্ডো বিতে কিছু ব্যবহারকারীর ক্রিয়া করার পরে একটি ফাংশন চলবে এবং একটি অ্যাপেন্ডচিল্ড করবে উইন্ডো এ ব্যবহার করে ফর্ম উপাদান window.opener.document.getElementById('formElement').appendChild(input);
এটি একটি ত্রুটি নিক্ষেপ করবে। document.createElement('input');
চাইল্ড উইন্ডোতে ইনপুট উপাদান তৈরি করে , এটিকে window.opener
উইন্ডো A তে প্যারামিটার হিসাবে পাস করার সাথে সাথে সেখানে সংযোজন রয়েছে with আমি যদি একই উইন্ডোতে ইনপুট উপাদানটি তৈরি করেছিলাম যেখানে এটি যুক্ত করতে যাচ্ছিলাম তবে এটি ত্রুটি ছাড়াই সফল হবে।
সুতরাং আমার উপসংহার (দয়া করে যাচাই করুন): document.createElement
একটি উইন্ডোতে কোনও উপাদান গতিশীলভাবে তৈরি (ব্যবহার করে ) তৈরি করা যাবে না এবং তারপরে .appendChild
অন্য উইন্ডোতে থাকা কোনও উপাদানকে (ব্যবহার করে ) যুক্ত করা যাবে ( সম্ভবত কোনও অতিরিক্ত অতিরিক্ত পদক্ষেপ না নিয়েই এটি XML হিসাবে বিবেচনা না করে তা নিশ্চিত করতে আমি মিস করেছি) অথবা অন্যকিছু). এটি আই 9 এ ব্যর্থ হয় এবং ত্রুটি ছুড়ে দেয়, এফএফ-তে এটি যদিও ঠিক কাজ করে।
পুনশ্চ. আমি jQuery ব্যবহার করি না।
এর আরেকটি কারণ সামনে আসতে পারে তা হল যে উপাদানটি প্রস্তুত হওয়ার আগে আপনি সংযোজন করছেন
<body>
<script>
document.body.appendChild(foo);
</script>
</body>
</html>
এই ক্ষেত্রে, আপনাকে স্ক্রিপ্টটি পরে সরিয়ে নিতে হবে। এটি কোশার কিনা তা পুরোপুরি নিশ্চিত নয়, তবে শরীরের পরে স্ক্রিপ্টটি সরিয়ে নেওয়া সাহায্য করবে বলে মনে হচ্ছে না: /
স্ক্রিপ্টটি সরানোর পরিবর্তে, আপনি ইভেন্ট হ্যান্ডলারে অ্যাডিংও করতে পারেন।
শুধু রেফারেন্সের জন্য।
আইই উপাদানটি যুক্ত করা হচ্ছে এমন উইন্ডো প্রসঙ্গ থেকে আলাদা উইন্ডো প্রসঙ্গে তৈরি হওয়া যে কোনও উপাদানকে যুক্ত করা অবরুদ্ধ করবে।
যেমন
var childWindow = window.open('somepage.html');
//will throw the exception in IE
childWindow.document.body.appendChild(document.createElement('div'));
//will not throw exception in IE
childWindow.document.body.appendChild(childWindow.document.createElement('div'));
আমি এখনও আলাদা উইন্ডো প্রসঙ্গটি ব্যবহার করে jQuery দিয়ে একটি ডোম উপাদান তৈরি করতে পারি তা বুঝতে পারি না।
আইপি 9-এ আমি এই ত্রুটিটি পেয়েছি যদি আমি স্ক্রিপ্ট ডিবাগিং (ইন্টারনেট এক্সপ্লোরার) বিকল্পটি অক্ষম করে থাকি। আমি যদি স্ক্রিপ্ট ডিবাগ সক্ষম করি তবে ত্রুটিটি দেখতে পাচ্ছি না এবং পৃষ্ঠাটি ভাল কাজ করে। এটি ডিওগ-এর ব্যতিক্রম সক্রিয় বা অক্ষম দ্বারা ডিবাগিংয়ের সাথে কী করেছে তা অদ্ভুত বলে মনে হচ্ছে।