473,836 Members | 2,005 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Where to put page-specific JavaScript

I have a little menu system which essentially takes HTML like:

<div id='foo'></div>

and retrieves foo.shtml from the server and inserts it inside the
<div>. But sometimes I'd like foo.shtml to look like:

<script language='JavaS cript'>
...do something AJAX-y
</script>
<div></div>

so that the script fills in the page. I've hacked together something
that inserts the foo.shtml into foo's div then does a
fooDiv.getEleme ntsByTagName('s cript') and uses eval() on them and it
works most of the time in some brossers but it seems hackish and
somewhat dangerous and it doesn't work everywhere. Surely there's an
AJAX idiom (or even a DOM built-in) to execute scripts as parts of
pages load. Can someone enlighten me? TIA.

Feb 26 '07
22 2360
Christopher Nelson said the following on 2/27/2007 8:21 AM:
On Feb 26, 9:28 pm, Randy Webb <HikksNotAtH... @aol.comwrote:
>...
>>>For my situation, it seems that rather than having foo.shtml
with an embedded script tag, I should have foo.shtml with some
structure and a companion foo.js which gets loaded into that structure
with the code above. Or am I missing the boat somehow?
That is probably the simplest way. You would load pageName.shtml and
pageName.js. Another option is to scan the innerHTML for SCRIPT
elements. If it has a source, load the .js file. If it has content, then
insert that content into the page.
...

I'm not clear on what innerHTML you're referring to.
Me saying the innerHTML was wrong. What you have to do is retrieve all
the script blocks from the container and process them. That is another
benefit of the scriptDiv approach.

allScripts=docu ment.getElement ById('container ').getElementsB yTagName('scrip t');

Now, you loop through allScripts (it is a collection) and handle each
script block. If it has a .src attribute you insert a .js file. If it
has text then you create an element and set its .text property.
If I have a foo.shtml:

<script src='foo.js'></script>
...some content here...

and bar.shtml:

<script type='text/javascript'>
...some code here...
</script>
...some content here...

I imagine a function which:

1. Gets the .shtml file from the server
2. Replaces the target div's innerHTML with the text returned
3. Uses div.getElements ByTagName('scri pt') to find all the scripts
in the
new content
a. If the script had a src attribute, gets the js from the server
or
b. If the script had content, extracts its innerHTML
then
Insert the script text in scriptDiv or the head or something
That is precisely what you have to do. The benefit of the scriptDiv is
you can simply use removeChild and remove all the script blocks or set
scriptDiv's innerHTML to "" to remove any old content.
This makes my suggested naming convention more flexible (foo.shtml can
use something other than or in addition to foo.js). My concern is
that IE7's been doing weird things as I play and I've read that
innerHTML isn't always supported.
What kind of weird things with IE7? Other than createTextNode (which is
broken with script elements in all IE's) I am unaware of any problems
with IE7 and dynamically creating script elements.

As for innerHTML, what modern browser doesn't support it? I don't know
of one personally but there may be one.
--
Randy
Chance Favors The Prepared Mind
comp.lang.javas cript FAQ - http://jibbering.com/faq/index.html
Javascript Best Practices - http://www.JavascriptToolbox.com/bestpractices/
Feb 28 '07 #11
On Feb 28, 12:45 am, Randy Webb <HikksNotAtH... @aol.comwrote:
Christopher Nelson said the following on 2/27/2007 8:21 AM:
...
I imagine a function which:
1. Gets the .shtml file from the server
2. Replaces the target div's innerHTML with the text returned
3. Uses div.getElements ByTagName('scri pt') to find all the scripts
in the new content
a. If the script had a src attribute, gets the js from the server
or
b. If the script had content, extracts its innerHTML
then
Insert the script text in scriptDiv or the head or something

That is precisely what you have to do. The benefit of the scriptDiv is
you can simply use removeChild and remove all the script blocks or set
scriptDiv's innerHTML to "" to remove any old content.
OK. I'm still struggling to understand JavaScript scoping and
persistence rules. If I read a dynamic page's <scriptelement' s
innerHTML, create a new script node, set that node's innerHTML, and
add that node as a child to scriptDiv, and then remove that script
node from scriptDiv, do functions defined in that script continue to
exist in the browser or do they only exist in the source text while
it's around?

As I sketched earlier, I imagine my pages having two types of scripts:
those that define functions to set up an environment and those that
are, essentially, onload handlers to invoke that environment. If I
have:

<script src='foo.js'></script>
<script language='JavaS cript'>
aFooFunction();
</script>

I'd like to cache foo.js's definitions against the possibility of
reviewing this page later. I can do that with xSmartLoadScrip t()
which puts the functions in the header and only retrieves them the
first time. But I only want aFooFunction() executed once. If I
append a new script node to a scriptDiv every time I load the page,
I'll be creating lots of nodes that get executed once. If I want that
code to be executed once, I'm tempted to set up:

<script src='foo.js'></script>
<script language='JavaS cript'>
aFooFunction();
</script>
<div id='fooScriptDi v'></div>

or something then when I find innerHTML in a script tag, create a new
script, add the innerHTML, append the new script node to fooScriptDiv
and immediately delete it. Or, at least, leave it there with the
knowledge that it'll get flushed when that dynamic content is replaced
by another file. My concern is that I don't know how soon I can
delete it. I've found that when I add a src-based script to the
document then immediately eval() code that invokes a function defined
in that script that the script fails with an error saying that the
function isn't defined. How can I know when the scr is processed?
This makes my suggested naming convention more flexible (foo.shtml can
use something other than or in addition to foo.js). My concern is
that IE7's been doing weird things as I play and I've read that
innerHTML isn't always supported.

What kind of weird things with IE7?
I don't have good notes but I know if was behaving strangely when I
was working with it a couple of days ago.
...
As for innerHTML, what modern browser doesn't support it? I don't know
of one personally but there may be one.
I may have been reading old notes or notes on old browsers.

Feb 28 '07 #12
On Feb 27, 8:21 am, "Christophe r Nelson" <cnel...@nycap. rr.comwrote:
On Feb 26, 9:28 pm, Randy Webb <HikksNotAtH... @aol.comwrote:
I imagine a function which:

1. Gets the .shtml file from the server
2. Replaces the target div's innerHTML with the text returned
3. Uses div.getElements ByTagName('scri pt') to find all the scripts
in the new content
a. If the script had a src attribute, gets the js from the server
or
b. If the script had content, extracts its innerHTML
then
Insert the script text in scriptDiv or the head or something

This makes my suggested naming convention more flexible (foo.shtml can
use something other than or in addition to foo.js). My concern is
that IE7's been doing weird things as I play and I've read that
innerHTML isn't always supported.
In IE7, div.getElements ByTagName('scri pt') is returning an empty array
even when I can clearly see <scriptin the responseText:

var e = document.getEle mentById(id);
e.innerHTML = req.responseTex t;

alert('req.resp onseText:'+req. responseText);

var scripts = e.getElementsBy TagName('script ');
alert(scripts.l ength+' scripts found for '+id);
if (scripts.length 0) {
for (var i = 0; i < scripts.length; ++i) {
var s = scripts[i];
if (s.innerHTML) {
var x = document.create Element('script ');
x.innerHTML = s.innerHTML;
var h = document.getEle mentsByTagName( 'head');
h[0].appendChild(x) ;
h[0].removeChild(x) ;
}
if (s.src) {
xSmartLoadScrip t(s.src);
}
}
}

This works in Firefox and Opera. It appears that IE isn't updating
the DOM tree when I set the div's innerHTML.

Feb 28 '07 #13
Christopher Nelson said the following on 2/28/2007 11:23 AM:
On Feb 27, 8:21 am, "Christophe r Nelson" <cnel...@nycap. rr.comwrote:
>On Feb 26, 9:28 pm, Randy Webb <HikksNotAtH... @aol.comwrote:
I imagine a function which:

1. Gets the .shtml file from the server
2. Replaces the target div's innerHTML with the text returned
3. Uses div.getElements ByTagName('scri pt') to find all the scripts
in the new content
a. If the script had a src attribute, gets the js from the server
or
b. If the script had content, extracts its innerHTML
then
Insert the script text in scriptDiv or the head or something

This makes my suggested naming convention more flexible (foo.shtml can
use something other than or in addition to foo.js). My concern is
that IE7's been doing weird things as I play and I've read that
innerHTML isn't always supported.

In IE7, div.getElements ByTagName('scri pt') is returning an empty array
even when I can clearly see <scriptin the responseText:

var e = document.getEle mentById(id);
e.innerHTML = req.responseTex t;

alert('req.resp onseText:'+req. responseText);
Does the very first item in the responseText happen to be a script
element? One thing I do know about IE7 is that if the very first element
is a script block then it gets fubar'ed. The solution I came up with was
to add an empty element prior to the string to get around it.

<URL:
http://groups.google.c om/group/comp.lang.javas cript/browse_thread/thread/56498ef2fabcefc 8/f79391b2eb1ebe1 f?lnk=gst&q=ran dy+webb+br+scri pt+dynamic&rnum =2#f79391b2eb1e be1f>

Is the thread where it was talked about. In testing locally I can't
duplicate the problem unless I make the first element a script block.

If that is not the issue can you give a URL to a test page I can look at?

--
Randy
Chance Favors The Prepared Mind
comp.lang.javas cript FAQ - http://jibbering.com/faq/index.html
Javascript Best Practices - http://www.JavascriptToolbox.com/bestpractices/
Mar 1 '07 #14
Christopher Nelson said the following on 2/28/2007 9:36 AM:
On Feb 28, 12:45 am, Randy Webb <HikksNotAtH... @aol.comwrote:
>Christopher Nelson said the following on 2/27/2007 8:21 AM:
...
>>I imagine a function which:
1. Gets the .shtml file from the server
2. Replaces the target div's innerHTML with the text returned
3. Uses div.getElements ByTagName('scri pt') to find all the scripts
in the new content
a. If the script had a src attribute, gets the js from the server
or
b. If the script had content, extracts its innerHTML
then
Insert the script text in scriptDiv or the head or something
That is precisely what you have to do. The benefit of the scriptDiv is
you can simply use removeChild and remove all the script blocks or set
scriptDiv's innerHTML to "" to remove any old content.

OK. I'm still struggling to understand JavaScript scoping and
persistence rules. If I read a dynamic page's <scriptelement' s
innerHTML, create a new script node, set that node's innerHTML, and
add that node as a child to scriptDiv, and then remove that script
node from scriptDiv, do functions defined in that script continue to
exist in the browser or do they only exist in the source text while
it's around?
Once you remove the code it is open to be Garbage Collected. Until it is
Garbaged it will remain. Otherwise it is gone as soon as you remove it.
As I sketched earlier, I imagine my pages having two types of scripts:
those that define functions to set up an environment and those that
are, essentially, onload handlers to invoke that environment. If I
have:

<script src='foo.js'></script>
<script language='JavaS cript'>
aFooFunction();
</script>

I'd like to cache foo.js's definitions against the possibility of
reviewing this page later. I can do that with xSmartLoadScrip t()
which puts the functions in the header and only retrieves them the
first time. But I only want aFooFunction() executed once. If I
append a new script node to a scriptDiv every time I load the page,
I'll be creating lots of nodes that get executed once. If I want that
code to be executed once, I'm tempted to set up:

<script src='foo.js'></script>
<script language='JavaS cript'>
aFooFunction();
</script>
<div id='fooScriptDi v'></div>

or something then when I find innerHTML in a script tag, create a new
script, add the innerHTML, append the new script node to fooScriptDiv
and immediately delete it. Or, at least, leave it there with the
knowledge that it'll get flushed when that dynamic content is replaced
by another file.
Yes, it will get flushed if you removeChild on the div element when you
want to load more:

Remove all child elements of scriptDiv
Add new children to scriptDiv
My concern is that I don't know how soon I can delete it.
I have never worried about it using the above order. If you empty out
the div before you append more then I have never run into an issue with
it. Even if the second set of scripts have a duplicate function name.
I've found that when I add a src-based script to the
document then immediately eval() code that invokes a function defined
in that script that the script fails with an error saying that the
function isn't defined. How can I know when the scr is processed?
The only way that I have found to reliable call a function in an
external file that is dynamically loaded is to put the function call at
the end of the file.

foo.js:

//lots of code here

someFunctionToE xecute()

//end of foo.js

--
Randy
Chance Favors The Prepared Mind
comp.lang.javas cript FAQ - http://jibbering.com/faq/index.html
Javascript Best Practices - http://www.JavascriptToolbox.com/bestpractices/
Mar 1 '07 #15
On Feb 28, 10:25 pm, Randy Webb <HikksNotAtH... @aol.comwrote:
Christopher Nelson said the following on 2/28/2007 11:23 AM:
In IE7, div.getElements ByTagName('scri pt') is returning an empty array
even when I can clearly see <scriptin the responseText:
var e = document.getEle mentById(id);
e.innerHTML = req.responseTex t;
alert('req.resp onseText:'+req. responseText);

Does the very first item in the responseText happen to be a script
element? One thing I do know about IE7 is that if the very first element
is a script block then it gets fubar'ed. The solution I came up with was
to add an empty element prior to the string to get around it.

<URL:http://groups.google.c om/group/comp.lang.javas cript/browse_thread/thr...>

Is the thread where it was talked about. In testing locally I can't
duplicate the problem unless I make the first element a script block.

If that is not the issue can you give a URL to a test page I can look at?
Yes, that's the issue. What a weird bug. I could have looked for
that for a decade or so without your clue. Thanks!

I've got:

var e = document.getEle mentById(id);
e.innerHTML = '<br>'+req.resp onseText;

var h = document.getEle mentsByTagName( 'head')[0];

var scripts = e.getElementsBy TagName('script ');
alert(scripts.l ength+' scripts found for '+id);
for (var i = 0; i < scripts.length; ++i) {
var s = scripts[i];
if (s.innerHTML) {
var x = document.create Element('script ');
x.innerHTML = s.innerHTML;
h.appendChild(x );
h.removeChild(x );
}
if (s.src) {
xSmartLoadScrip t(s.src);
}
}

And IE7 gives me an "Unknown runtime error" on "x.innerHTM L =
s.innerHTML". Firefox and Opera are happy with that code. :-(

Mar 1 '07 #16
On Feb 28, 10:30 pm, Randy Webb <HikksNotAtH... @aol.comwrote:
Christopher Nelson said the following on 2/28/2007 9:36 AM:
...
I've found that when I add a src-based script to the
document then immediately eval() code that invokes a function defined
in that script that the script fails with an error saying that the
function isn't defined. How can I know when the scr is processed?

The only way that I have found to reliable call a function in an
external file that is dynamically loaded is to put the function call at
the end of the file.

foo.js:

//lots of code here

someFunctionToE xecute()

//end of foo.js
My testing so far seems to support the idea that I can: 1) add a
script element with a src value which contains function definitions,
2) add a script element with innerHTML (with a prefixed <br>) which
invokes a function, 3) immediately remove the script element with the
innerHTML. I guess I'll see if that really works on all the browsers
I care about when I get IE to complaining about lines that are just
fine!

Mar 1 '07 #17
Christopher Nelson said the following on 3/1/2007 9:30 AM:
On Feb 28, 10:25 pm, Randy Webb <HikksNotAtH... @aol.comwrote:
>Christopher Nelson said the following on 2/28/2007 11:23 AM:
>>In IE7, div.getElements ByTagName('scri pt') is returning an empty array
even when I can clearly see <scriptin the responseText:
var e = document.getEle mentById(id);
e.innerHTML = req.responseTex t;
alert('req.resp onseText:'+req. responseText);
Does the very first item in the responseText happen to be a script
element? One thing I do know about IE7 is that if the very first element
is a script block then it gets fubar'ed. The solution I came up with was
to add an empty element prior to the string to get around it.

<URL:http://groups.google.c om/group/comp.lang.javas cript/browse_thread/thr...>

Is the thread where it was talked about. In testing locally I can't
duplicate the problem unless I make the first element a script block.

If that is not the issue can you give a URL to a test page I can look at?

Yes, that's the issue. What a weird bug. I could have looked for
that for a decade or so without your clue. Thanks!

I've got:

var e = document.getEle mentById(id);
e.innerHTML = '<br>'+req.resp onseText;

var h = document.getEle mentsByTagName( 'head')[0];

var scripts = e.getElementsBy TagName('script ');
alert(scripts.l ength+' scripts found for '+id);
for (var i = 0; i < scripts.length; ++i) {
var s = scripts[i];
if (s.innerHTML) {
var x = document.create Element('script ');
x.innerHTML = s.innerHTML;
x.text = s.innerHTML;

--
Randy
Chance Favors The Prepared Mind
comp.lang.javas cript FAQ - http://jibbering.com/faq/index.html
Javascript Best Practices - http://www.JavascriptToolbox.com/bestpractices/
Mar 1 '07 #18
Christopher Nelson said the following on 3/1/2007 9:39 AM:
On Feb 28, 10:30 pm, Randy Webb <HikksNotAtH... @aol.comwrote:
>Christopher Nelson said the following on 2/28/2007 9:36 AM:
...
>>I've found that when I add a src-based script to the
document then immediately eval() code that invokes a function defined
in that script that the script fails with an error saying that the
function isn't defined. How can I know when the scr is processed?
The only way that I have found to reliable call a function in an
external file that is dynamically loaded is to put the function call at
the end of the file.

foo.js:

//lots of code here

someFunctionTo Execute()

//end of foo.js

My testing so far seems to support the idea that I can: 1) add a
script element with a src value which contains function definitions,
2) add a script element with innerHTML (with a prefixed <br>) which
invokes a function,
Don't set the script elements innerHTML, set it's .text property. See
the other reply about it.

--
Randy
Chance Favors The Prepared Mind
comp.lang.javas cript FAQ - http://jibbering.com/faq/index.html
Javascript Best Practices - http://www.JavascriptToolbox.com/bestpractices/
Mar 1 '07 #19
VK
On Feb 27, 11:00 am, "-Lost" <spam_ninjaREMO V...@REMOVEMEco mcast.net>
wrote:
So anyway, I was
wondering if you load however many scripts, you can at some point remove them and they can
still be available to the script?
Yes.
<scriptelemen t is a "delivery shell" for text source being parsed.
After being successfully parsed you can remove that <scriptelemen t -
or all <scriptelemen ts all together from the page, it has no effect
on the execution context. Think of egg shells in the barn and happy
chickens on the backyard. What effect does it make on chikens if you
clean up the barn from the egg shells? Same for <scriptelemen ts and
the execution context.
Mar 1 '07 #20

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
3265
by: Alex Vorobiev | last post by:
admittedly, this SP is probably a mess given that I am not a TSQL pro. its purpose is to, based on the arguments, do 1) paging or 2) return prev/next ids for a given record. it does the job, but at the cost of several seconds. i was hoping someone could give me pointers on how to optimize it. perhaps, i should break it down into smaller SPs, or create additional indices on the source table, etc. thank you in advance for your help!
1
11723
by: Michael | last post by:
I have a table that has the following fields: tblECHECK ID (autonumber identity column) PTID Batchnum Page DataPoint DPValue
5
4078
by: Rachel Weeden | last post by:
I'm working on an ASP Web application, and am having syntax issues in a WHERE statement I'm trying to write that uses the CInt Function on a field. Basically, I want to select records using criteria of Race, Gender and Crime Code. But the Crime Code field in the table is text, and I cannot change it. I want to use a range of crime codes, so need to convert it to an integer on-the-fly. Here's what I have in my code so far:
36
4119
by: Jack Hughes | last post by:
This argument has come up two or three times lately. We have a web standards document at our company that say "Use valid HTML 4; We don't recommend switching to DIV-based CSS-P for layout just yet though, tables are a lot easier." That's because we have a lot of developers who aren't ready to move to CSS-P and DIVs just yet. But I'm being told our policies were contradictory. If we're going to
4
1582
by: Maellic | last post by:
Hi, I'm having real trouble locating configuration settings on an existing website. Details follow: I've recently taken over a website developed with ASP.NET. Unfortunately the original developer has left the company and has left no documentation whatsoever. I've successfully managed to make a few updates to the website but I've recently hit a snag.
3
2757
by: sean | last post by:
I have a table with fixed row of records SORTED by DATE using ADO pagination method. The user can click a link in one table cell and go to another page to modify the record. Once the updated record is saved the user will be redirect back to the table. This time the record updated will be highlighted so that the user knows where he came from. I basically pass the page number, column and row number via querystring and store the info in a...
4
1301
by: D | last post by:
Hi I'm obviously still learning here but what I've created is a page with a calendar and button. When I click the button I do a number of tasks and would like to output the progress in messages such as Starting TaskA Processing TaskA Completed TaskA
6
2054
by: Liming | last post by:
Hi, In a typical 3 tier model (view layer, busines layer and data access layer) where do you handle your exceptions? do you let it buble up all the way to the .aspx pages or do you handle it in your business layer and/or data access layer? suppose in my data access layer, I provide try and catch, log the exception and re-throw it back to business layer, then in yoru business layer, what do you do? throw it back to the code behind or...
2
1474
by: Mr. T | last post by:
Hi, i have a master page, and then my aspx page that uses that master page. Now in my aspx i want to use a LinkButton to sort data on my page. My question is where do i put the sub the LinkButton is calling to? If i put it outside the <asp:Content tags i get an error that i can't place it there. When i place the sub inside the content-tags i also get an error that i can't place it there.
3
3347
by: saundra | last post by:
This appears to be the code that is giving me trouble. Can someone help <? include("common.php"); require_once("$HeaderFile"); if(empty($_GET)){ $Start = '0'; }else{ $Start = $_GET;
0
9670
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10844
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
1
10591
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
10254
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
9374
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
7792
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
5649
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
2
4016
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
3115
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.