একটি ডিওএম নোডের স্ট্রিং প্রতিনিধিত্ব পান


99

জাভাস্ক্রিপ্ট: আমার কাছে নোডের ডিওএম প্রতিনিধিত্ব (উপাদান বা নথি) আছে এবং আমি এর স্ট্রিং প্রতিনিধিত্ব খুঁজছি। যেমন,

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

ফলন করা উচিত:

get_string(el) == "<p>Test</p>";

আমার দৃ strong় অনুভূতি আছে যে আমি তুচ্ছ সহজ কিছু মিস করছি, তবে আমি কেবল এমন কোনও পদ্ধতি খুঁজে পাই না যা আইই, এফএফ, সাফারি এবং অপেরাতে কাজ করে। সুতরাং, আউটআরএইচটিএমএল কোনও বিকল্প নয়।


4
সম্ভবত সংস্করণ 11 এর সাথে ফায়ারফক্স বাইরের এইচটিএমএল সমর্থন করে: bugzilla.mozilla.org/show_bug.cgi?id=92264
বোল্ডউইন

4
আপাতত, আইআই, এফএফ, সাফারি, ক্রোম, অপেরা সমস্ত বাহ্যিক এইচটিএমএল সমর্থন করে দেখুন, বিকাশকারী.মোজিলা.আর.ইন.এস.
ডকস

4
হ্যাঁ, এটি এখন (২০০৯ সাল থেকে) একটি তুচ্ছ কাজ হয়ে গেছে :)
বোল্ডউইন

হ্যাঁ, অবশ্যই বাইরের এইচটিএমএল
নিউজামিক

উত্তর:


138

আপনি একটি অস্থায়ী অভিভাবক নোড তৈরি করতে পারেন এবং এর অভ্যন্তরীণ এইচটিএমএল সামগ্রী পাবেন:

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

var tmp = document.createElement("div");
tmp.appendChild(el);
console.log(tmp.innerHTML); // <p>Test</p>

সম্পাদনা: বাইরের এইচটিএমএল সম্পর্কে দয়া করে নীচে উত্তর দেখুন। el.outerHTML এর যা প্রয়োজন তা হ'ল।


4
আউচ। এত সহজ ... সামান্য নোট: আমি যদি পুরো দস্তাবেজটি "স্ট্রিংফাইড" করতে চাই, আমি ডকুমেন্ট.ডোকামেন্টএলমেন্টের সাথে একই পদ্ধতিটি ব্যবহার করতে পারি (ইউজকেস: এজেএক্স অনুরোধগুলি)। সম্ভবত আপনি উত্তর অন্তর্ভুক্ত করতে পারে?
বোলডউইন

4
@ বোল্ডউইন: আপনি কি পুরোটিকে একটি ডিভিতে যুক্ত করতে পারবেন document.documentElement? পবিত্র
বিড়ম্বনা

সরল, নরক হিসাবে ... +1 খুব খারাপ ডকুমেন্ট ফ্রেমটি অন্তর্নিহিত এইচটিএমএল সমর্থন করে না
লাজোস

30
আউটআর এইচটিএমএল এর উত্তর
নিউমিউজিক

4
আপনি elementএটি যুক্ত করার সময় এটি tmpবোকোজে যুক্ত করার আগে আপনার ক্লোন করতে ভুলবেন না tmp, এটি এখান থেকে সরানো হবে document
অলকেয়ে এরটাş

46

আপনি যা সন্ধান করছেন তা 'আউটআর এইচটিএমএল' তবে পুরাতন ব্রাউজারগুলির সাথে সামঞ্জস্যপূর্ণ নয় এমন ফ্যালব্যাক কোজ দরকার।

var getString = (function() {
  var DIV = document.createElement("div");

  if ('outerHTML' in DIV)
    return function(node) {
      return node.outerHTML;
    };

  return function(node) {
    var div = DIV.cloneNode();
    div.appendChild(node.cloneNode(true));
    return div.innerHTML;
  };

})();

// getString(el) == "<p>Test</p>"

আপনি আমার jQuery প্লাগইনটি এখানে পাবেন: নির্বাচিত উপাদানটির বাইরের এইচটিএমএল পান


outerHTMLআমি প্রশ্ন জিজ্ঞাসার পরে ফায়ারফক্স 11 সংস্করণে যুক্ত করেছে। সুতরাং এটি আর বিকল্প ছিল না। আপনি যদি ঘনিষ্ঠভাবে দেখেন তবে আমি আমার প্রশ্নটিকে একটি উপযুক্ত মন্তব্য দিয়ে আপডেট করেছি।
বোল্ডউইন

এই অধিকার, আপনি যদি উপাদান আইডি এবং অন্যান্য অ্যাটর্স ব্যবহার করেন তবে innerHtml
কোজ করুন

4
@ সের্গেইপানফিলভ: ফোন করার আগে খালি ডিভিতে নোড জড়িয়ে রাখার কারণে আমি কিছুই ফেলিনি innerHTML; )
gtournie

4
২০১৫-এ, আমি বলব এটি সর্বোত্তম উত্তরের and
ACK_stoverflow

হ্যাঁ, আজকের হিসাবে, কেবলমাত্র খুব পুরানো (IE> 10, সাফারি> 7, সত্যই প্রাচীন এফএফ, ক্রোম) এবং / অথবা অস্পষ্ট ব্রাউজারগুলি (অপেরা মিনি) outerHTMLবৈশিষ্ট্যটিকে সমর্থন করে না । আরও দেখুন caniuse.com/#feat=xml-serializer
গার্টি Sønderby


15

এফএফ এর অধীনে আপনি XMLSerializerএক্সএমএলকে স্ট্রিংয়ে সিরিয়ালাইজ করতে অবজেক্টটি ব্যবহার করতে পারেন । আইই আপনাকে xmlনোডের সম্পত্তি দেয় । সুতরাং আপনি নিম্নলিখিতটি করতে পারেন:

function xml2string(node) {
   if (typeof(XMLSerializer) !== 'undefined') {
      var serializer = new XMLSerializer();
      return serializer.serializeToString(node);
   } else if (node.xml) {
      return node.xml;
   }
}

এফওয়াইআই .xmlডোম নোডগুলিতে কাজ করে না (বর্তমান পৃষ্ঠায় নোডের মতো)। এটি কেবল এক্সএমএল ডম ডকুমেন্ট নোডগুলিতে কাজ করে।
ক্রিসেন্ট ফ্রেশ

এবং বিপরীতে, outerHTMLএক্সএমএল ডম ডকুমেন্ট নোডগুলিতে কাজ করে না। এটি কেবল ডোম নোডগুলিতে কাজ করে (বর্তমান পৃষ্ঠার নোডের মতো)। সেখানে ভাল ধারাবাহিকতা আমি বলতে চাই।
ক্রিসেন্ট ফ্রেশ

7

এলিমেন্ট # বহিরাগত HTML ব্যবহার করুন:

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

console.log(el.outerHTML);

এটি ডিওএম উপাদানগুলি লেখার জন্যও ব্যবহার করা যেতে পারে। মজিলার ডকুমেন্টেশন থেকে:

উপাদান ডিওএম ইন্টারফেসের বহিরাগত এইচটিএমএল বৈশিষ্ট্যটি সিরিয়ালযুক্ত এইচটিএমএল খণ্ডকে এর বংশধরসহ উপাদানটির বর্ণনা দেয়। প্রদত্ত স্ট্রিং থেকে পার্স করা নোডের সাথে উপাদানটি প্রতিস্থাপন করতে সেট করা যেতে পারে।

https://developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML


3

বাইরের ট্যাগ এবং বৈশিষ্ট্য সহ উপাদানটির পূর্ণ প্রতিনিধিত্ব পেতে এলিমেন্ট.উটারএইচটিএমএল ব্যবহার করুন।


1

যদি আপনার উপাদানটির পিতামাতা থাকে

element.parentElement.innerHTML

4
উত্তর করার জন্য ধন্যবাদ! দুর্ভাগ্যক্রমে এটি ইতিমধ্যে প্রস্তাবিত ছিল, তবে উত্তরদাতা উত্তরটি মুছে ফেলে। সমস্যাটি হল, পিতামাতার চেয়ে চেয়ে অনেক বেশি মার্কআপ থাকতে পারে । <li>তালিকার একক জন্য আউটআরএইচটিএমএল চিন্তা করুন ।
বোলডউইন


1

আমি খুঁজে পেয়েছি যে আমার ব্যবহারের ক্ষেত্রে আমি সর্বদা পুরো বাইরের এইচটিএমএল চাই না। অনেকগুলি নোডে দেখানোর মতো অনেকগুলি শিশু রয়েছে।

এখানে একটি ফাংশন রয়েছে (ক্রোমে সর্বনিম্ন পরীক্ষিত):

/**
 * Stringifies a DOM node.
 * @param {Object} el - A DOM node.
 * @param {Number} truncate - How much to truncate innerHTML of element.
 * @returns {String} - A stringified node with attributes
 *                     retained.
 */
function stringifyEl(el, truncate) {
    var truncateLen = truncate || 50;
    var outerHTML = el.outerHTML;
    var ret = outerHTML;
    ret = ret.substring(0, truncateLen);

    // If we've truncated, add an elipsis.
    if (outerHTML.length > truncateLen) {
      ret += "...";
    }
    return ret;
}

https://gist.github.com/kahunacohen/467f5cc259b5d4a85eb201518dcb15ec


0

আমি গৃহীত উত্তরের কোডটি দিয়ে ডোমিলিমেন্টগুলির মাধ্যমে পুনরাবৃত্তি করার সময় কী ভুল তা ভেবে অনেক সময় নষ্ট করেছি। এটি আমার পক্ষে কাজ করেছিল, অন্যথায় প্রতিটি দ্বিতীয় উপাদান নথি থেকে অদৃশ্য হয়ে যায়:

_getGpxString: function(node) {
          clone = node.cloneNode(true);
          var tmp = document.createElement("div");
          tmp.appendChild(clone);
          return tmp.innerHTML;
        },

4
যখন আমি মনে করি যে এখানে কোনও আলাদা সমস্যা আছে তখন আমি কোনও অঙ্গ নিয়ে বাইরে যাই না। দ্রষ্টব্য, যে উপরের সমাধানটি ডিওএম থেকে মূল উপাদানটি সরিয়ে দেয় । সুতরাং, আপনি যখন লাইভ সংগ্রহটি ব্যবহার করেন, তখন document.getElementsByTagName()সেই সংগ্রহটি মধ্য- forলুপ বদলে যাবে, সুতরাং প্রতিটি দ্বিতীয় উপাদানকে এড়িয়ে চলে।
বোল্ডউইন

-1

যদি প্রতিক্রিয়া ব্যবহার করে:

const html = ReactDOM.findDOMNode(document.getElementsByTagName('html')[0]).outerHTML;

.outerHTMLপ্রতিক্রিয়া নির্দিষ্ট নয়; এটি একটি ডিওএম স্ট্যান্ডার্ড। @ রিচ অ্যাপোডাকার উত্তরটি দেখুন।
ছারভে

হ্যাঁ ... আমার উত্তরটির আগ্রহের বিষয়টি (যদি প্রতিক্রিয়া ব্যবহার করে) ছিল reactdom.findDOMNode()তা ছিল ... না .outerHTML, তবে অবস্থানের জন্য ধন্যবাদ।
ভিক্টোর্চরাউচি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.