我正在做的是使用纯javascript生成帖子导航。但它显示 beforeClosingTag不是函数
在下面的工具中,它应该是一个函数,因为我在onClosingTag之前编写了一个函数代码。 在代码段中,它可以生成ul列表但是如果您通过Web检查器看到,仍然可以找到:
**Uncaught TypeError: greatApp.tools.insertHTMLString.beforeClosingTag is not a function**
除此之外,在我的本地环境中,相同的代码但它甚至无法显示ul列表,我不知道为什么。感谢
//global tools function(insertHTMLString.beforeClosingTag)
var greatApp = greatApp || {};
(function(){
greatApp.tools = {
insertHTMLString: function(){
/*****
if elements have a native insertAdjacentHTML : use it in four html insertion functions with more sensible names
*****/
if(document.createElement('div').insertAdjacentHTML){
return {
beforeOpeningTag: function(element,htmlString){
element.insertAdjacentHTML('beforebegin',htmlString);
},
afterOpeningTag: function(element,htmlString){
element.insertAdjacentHTML('afterbegin',htmlString);
},
beforeClosingTag: function(element,htmlString){
element.insertAdjacentHTML('beforeend',htmlString);
},
afterClosingTag: function(element,htmlString){
element.insertAdjacentHTML('afterend',htmlString);
}
}
}//end if
/********
otherwise, we have no native insertAdjacentHTML : implement the same four insertion functions and then use them to define insertAdjacentHTML
******/
function fragment(htmlString){
var ele = document.createElement('div');
var frag = document.createDocumentFragment();
ele.innerHTML = htmlString;
//move all nodes from ele to frag
while(ele.firstChild)
frag.appendChild(ele.firstChild);
return frag;
}
var insertHTMLString = {
beforeOpeningTag: function(element,htmlString){
element.parentNode.insertBefore(fragment(htmlString),element);
},
afterOpeningTag: function(element,htmlString){
element.parentNode.insertBefore(fragment(htmlString),element.firstChild);
},
beforeClosingTag: function(element,htmlString){
element.parentNode.appendChild(fragment(htmlString));
},
afterClosingTag: function(element,htmlString){
element.parentNode.insertBefore(fragment(htmlString),element.nextSibling);
}
};
/**
now implement insertAdjacentHMTL based on the functions above
**/
Element.prototype.insertAdjacentHMTL = function(pos, htmlString){
switch(pos.toLowerCase()){
case "beforebegin": return insertHTMLString.beforeOpeningTag(this, htmlString);
case "afterbegin": return insertHTMLString.afterOpeningTag(this, htmlString);
case "beforeend": return insertHTMLString.beforeClosingTag(this, htmlString);
case "afterend": return insertHTMLString.beforeClosingTag(this, htmlString);
}
};
return insertHTMLString;
},
}}());
//post js
(function(){
var titles = document.querySelectorAll('.sideNav h3');
var sideList = document.getElementsByClassName('sideList')[0];
var ul = document.querySelectorAll('.sideList ul')[0];
for(var i = 0; i< titles.length; i++){
var aWithhref = '<a href = ' + '#' + titles[i].getAttribute('id') + '>';
var titleText = titles[i].textContent || titles[i].innerText;
var li = '<li>'+ aWithhref + titleText +'</a>'+ '</li>';
(Element.prototype.insertAjacentHTML)? ul.insertAdjacentHTML('beforeend',li) : greatApp.tools.insertHTMLString.beforeClosingTag(ul, li);
}
}());
&#13;
<div class="row expanded docHomeDetails sideNav">
<h3 id="homeCollectionUpdate"># Update</h3>
<h3 id="homee"># home</h3>
<h3 id="Update"># forum</h3>
</div>
<div class="small-12 medium-4 columns sideList" data-sticky-container >
<div class="sticky" data-sticky data-top-anchor="homeCollectionUpdate" data-btm-anchor="homeCollectionMentorWrapper:bottom">
<ul>
<p>页面导航</p>
</ul>
</div>
</div>
</div>
&#13;
感谢您的帮助。
我的代码如下:
// HTML
<div class="small-12 medium-4 columns sideList" data-sticky-container >
<div class="sticky" data-sticky data-top-anchor="homeCollectionUpdate" data-btm-anchor="homeCollectionMentorWrapper:bottom">
<ul>
<p>页面导航</p>
</ul>
</div>
</div>
// java描述
(function(){
var titles = document.querySelectorAll('.sideNav h3');
var sideList = document.getElementsByClassName('sideList')[0];
var ul = document.querySelectorAll('.sideList ul')[0];
for(var i = 0; i< titles.length; i++){
var aWithhref = '<a href = ' + '#' + titles[i].getAttribute('id') + '>';
var titleText = titles[i].textContent || titles[i].innerText;
var li = '<li>'+ aWithhref + titleText +'</a>'+ '</li>';
(Element.prototype.insertAjacentHTML)? ul.insertAdjacentHTML('beforeend',li) : greatApp.tools.insertHTMLString.beforeClosingTag(ul, li);
}
}());
//全局工具函数(insertHTMLString.beforeClosingTag)
var greatApp = greatApp || {};
(function(){
greatApp.tools = {
insertHTMLString: function(){
/*****
if elements have a native insertAdjacentHTML : use it in four html insertion functions with more sensible names
*****/
if(document.createElement('div').insertAdjacentHTML){
return {
beforeOpeningTag: function(element,htmlString){
element.insertAdjacentHTML('beforebegin',htmlString);
},
afterOpeningTag: function(element,htmlString){
element.insertAdjacentHTML('afterbegin',htmlString);
},
beforeClosingTag: function(element,htmlString){
element.insertAdjacentHTML('beforeend',htmlString);
},
afterClosingTag: function(element,htmlString){
element.insertAdjacentHTML('afterend',htmlString);
}
}
}//end if
/********
otherwise, we have no native insertAdjacentHTML : implement the same four insertion functions and then use them to define insertAdjacentHTML
******/
function fragment(htmlString){
var ele = document.createElement('div');
var frag = document.createDocumentFragment();
ele.innerHTML = htmlString;
//move all nodes from ele to frag
while(ele.firstChild)
frag.appendChild(ele.firstChild);
return frag;
}
var insertHTMLString = {
beforeOpeningTag: function(element,htmlString){
element.parentNode.insertBefore(fragment(htmlString),element);
},
afterOpeningTag: function(element,htmlString){
element.parentNode.insertBefore(fragment(htmlString),element.firstChild);
},
beforeClosingTag: function(element,htmlString){
element.parentNode.appendChild(fragment(htmlString));
},
afterClosingTag: function(element,htmlString){
element.parentNode.insertBefore(fragment(htmlString),element.nextSibling);
}
};
/**
now implement insertAdjacentHMTL based on the functions above
**/
Element.prototype.insertAdjacentHMTL = function(pos, htmlString){
switch(pos.toLowerCase()){
case "beforebegin": return insertHTMLString.beforeOpeningTag(this, htmlString);
case "afterbegin": return insertHTMLString.afterOpeningTag(this, htmlString);
case "beforeend": return insertHTMLString.beforeClosingTag(this, htmlString);
case "afterend": return insertHTMLString.beforeClosingTag(this, htmlString);
}
};
return insertHTMLString;
},
}}());
答案 0 :(得分:0)
这是因为insertHTMLString
是一个函数,而不是一个对象。您可以创建一个对象,如:
var innerHTMLObj = new greatApp.tools.insertHTMLString();
(Element.prototype.insertAjacentHTML) ?
ul.insertAdjacentHTML('beforeend', li):
innerHTMLObj.beforeClosingTag(ul, li);
您可以用IIFE
替换它。
//global tools function(insertHTMLString.beforeClosingTag)
var greatApp = greatApp || {};
(function() {
greatApp.tools = {
insertHTMLString: function() {
/*****
if elements have a native insertAdjacentHTML : use it in four html insertion functions with more sensible names
*****/
if (document.createElement('div').insertAdjacentHTML) {
return {
beforeOpeningTag: function(element, htmlString) {
element.insertAdjacentHTML('beforebegin', htmlString);
},
afterOpeningTag: function(element, htmlString) {
element.insertAdjacentHTML('afterbegin', htmlString);
},
beforeClosingTag: function(element, htmlString) {
element.insertAdjacentHTML('beforeend', htmlString);
},
afterClosingTag: function(element, htmlString) {
element.insertAdjacentHTML('afterend', htmlString);
}
}
} //end if
/********
otherwise, we have no native insertAdjacentHTML : implement the same four insertion functions and then use them to define insertAdjacentHTML
******/
function fragment(htmlString) {
var ele = document.createElement('div');
var frag = document.createDocumentFragment();
ele.innerHTML = htmlString;
//move all nodes from ele to frag
while (ele.firstChild)
frag.appendChild(ele.firstChild);
return frag;
}
var insertHTMLString = {
beforeOpeningTag: function(element, htmlString) {
element.parentNode.insertBefore(fragment(htmlString), element);
},
afterOpeningTag: function(element, htmlString) {
element.parentNode.insertBefore(fragment(htmlString), element.firstChild);
},
beforeClosingTag: function(element, htmlString) {
element.parentNode.appendChild(fragment(htmlString));
},
afterClosingTag: function(element, htmlString) {
element.parentNode.insertBefore(fragment(htmlString), element.nextSibling);
}
};
/**
now implement insertAdjacentHMTL based on the functions above
**/
Element.prototype.insertAdjacentHMTL = function(pos, htmlString) {
switch (pos.toLowerCase()) {
case "beforebegin":
return insertHTMLString.beforeOpeningTag(this, htmlString);
case "afterbegin":
return insertHTMLString.afterOpeningTag(this, htmlString);
case "beforeend":
return insertHTMLString.beforeClosingTag(this, htmlString);
case "afterend":
return insertHTMLString.beforeClosingTag(this, htmlString);
}
};
return insertHTMLString;
},
}
}());
//post js
(function() {
var titles = document.querySelectorAll('.sideNav h3');
var sideList = document.getElementsByClassName('sideList')[0];
var ul = document.querySelectorAll('.sideList ul')[0];
for (var i = 0; i < titles.length; i++) {
var aWithhref = '<a href = ' + '#' + titles[i].getAttribute('id') + '>';
var titleText = titles[i].textContent || titles[i].innerText;
var li = '<li>' + aWithhref + titleText + '</a>' + '</li>';
var innerHTMLObj = new greatApp.tools.insertHTMLString();
(Element.prototype.insertAjacentHTML) ? ul.insertAdjacentHTML('beforeend', li): innerHTMLObj.beforeClosingTag(ul, li);
}
}());
&#13;
<div class="row expanded docHomeDetails sideNav">
<h3 id="homeCollectionUpdate"># Update</h3>
<h3 id="homee"># home</h3>
<h3 id="Update"># forum</h3>
<div class="small-12 medium-4 columns sideList" data-sticky-container>
<div class="sticky" data-sticky data-top-anchor="homeCollectionUpdate" data-btm-anchor="homeCollectionMentorWrapper:bottom">
<ul>
<p>页面导航</p>
</ul>
</div>
</div>
</div>
&#13;
//global tools function(insertHTMLString.beforeClosingTag)
var greatApp = greatApp || {};
(function() {
greatApp.tools = {
insertHTMLString: (function() {
/*****
if elements have a native insertAdjacentHTML : use it in four html insertion functions with more sensible names
*****/
if (document.createElement('div').insertAdjacentHTML) {
return {
beforeOpeningTag: function(element, htmlString) {
element.insertAdjacentHTML('beforebegin', htmlString);
},
afterOpeningTag: function(element, htmlString) {
element.insertAdjacentHTML('afterbegin', htmlString);
},
beforeClosingTag: function(element, htmlString) {
element.insertAdjacentHTML('beforeend', htmlString);
},
afterClosingTag: function(element, htmlString) {
element.insertAdjacentHTML('afterend', htmlString);
}
}
} //end if
/********
otherwise, we have no native insertAdjacentHTML : implement the same four insertion functions and then use them to define insertAdjacentHTML
******/
function fragment(htmlString) {
var ele = document.createElement('div');
var frag = document.createDocumentFragment();
ele.innerHTML = htmlString;
//move all nodes from ele to frag
while (ele.firstChild)
frag.appendChild(ele.firstChild);
return frag;
}
var insertHTMLString = {
beforeOpeningTag: function(element, htmlString) {
element.parentNode.insertBefore(fragment(htmlString), element);
},
afterOpeningTag: function(element, htmlString) {
element.parentNode.insertBefore(fragment(htmlString), element.firstChild);
},
beforeClosingTag: function(element, htmlString) {
element.parentNode.appendChild(fragment(htmlString));
},
afterClosingTag: function(element, htmlString) {
element.parentNode.insertBefore(fragment(htmlString), element.nextSibling);
}
};
/**
now implement insertAdjacentHMTL based on the functions above
**/
Element.prototype.insertAdjacentHMTL = function(pos, htmlString) {
switch (pos.toLowerCase()) {
case "beforebegin":
return insertHTMLString.beforeOpeningTag(this, htmlString);
case "afterbegin":
return insertHTMLString.afterOpeningTag(this, htmlString);
case "beforeend":
return insertHTMLString.beforeClosingTag(this, htmlString);
case "afterend":
return insertHTMLString.beforeClosingTag(this, htmlString);
}
};
return insertHTMLString;
})(),
}
}());
//post js
(function() {
var titles = document.querySelectorAll('.sideNav h3');
var sideList = document.getElementsByClassName('sideList')[0];
var ul = document.querySelectorAll('.sideList ul')[0];
for (var i = 0; i < titles.length; i++) {
var aWithhref = '<a href = ' + '#' + titles[i].getAttribute('id') + '>';
var titleText = titles[i].textContent || titles[i].innerText;
var li = '<li>' + aWithhref + titleText + '</a>' + '</li>';
(Element.prototype.insertAjacentHTML) ? ul.insertAdjacentHTML('beforeend', li): greatApp.tools.insertHTMLString.beforeClosingTag(ul, li);
}
}());
&#13;
<div class="row expanded docHomeDetails sideNav">
<h3 id="homeCollectionUpdate"># Update</h3>
<h3 id="homee"># home</h3>
<h3 id="Update"># forum</h3>
<div class="small-12 medium-4 columns sideList" data-sticky-container>
<div class="sticky" data-sticky data-top-anchor="homeCollectionUpdate" data-btm-anchor="homeCollectionMentorWrapper:bottom">
<ul>
<p>页面导航</p>
</ul>
</div>
</div>
</div>
&#13;