UserJS.org

Avoiding page address detection mistakes

Written on 2005-06-01 09:35 by tarquin. Last modified 2005-09-19 09:19

If is a script is intended to be active only on certain pages, it is important to ensure that the page address is correctly detected. The simple way is to use @include or @exclude like this:

// @include http://example.com/*
// @include http://www.example.com/easy/*

or

// @exclude http://userjs.org/*

If you want a little bit more control, you can use 'indexOf' or 'match', but be very careful with using these. A URL may contain more than one page address, and it is common to cause problems by incorrectly matching pages.

Examples of common mistakes:

if( location.href.indexOf('example.com') != -1 )
  • http://www.example.com/test.html
  • http://twoexample.commands.userjs.org/
  • http://userjs.org/pagelist?reference=example.com
  • http://userjs.org/twoexample.commands/
if( location.href.indexOf('http:\/\/example.com\/') != -1 )
  • http://example.com/test.html
  • http://userjs.org/pagelist?reference=http://example.com/
if( location.hostname.indexOf('example.com') != -1 )
  • http://www.example.com/
  • http://example.commands.userjs.org/
  • http://noexample.commands.userjs.org/
if( location.hostname.indexOf('example.com') == 0 )
  • http://example.com/
  • http://example.commands.userjs.org/
if( location.hostname.match(/example\.com/) )
  • http://www.example.com/
  • http://example.commands.userjs.org/
  • http://noexample.commands.userjs.org/
if( location.hostname.match(/example\.com$/) )
  • http://www.example.com/
  • http://example.com/
  • http://wehavenoexample.com/
if( location.hostname.match(/\bexample\.com$/) )
  • http://www.example.com/
  • http://example.com/
  • http://we-have-no-example.com/

More reliable ways to check the address

(Note that it is correct to escape forward slashes with backslashes inside strings and regular expressions: '\/')

Exact hostname:
if( location.hostname == 'example.com' )
Exact hostname (less efficient):
if( location.hostname.match(/^example\.com$/) )
All files within a given path:
if( location.href.indexOf('http:\/\/example.com\/files\/') == 0 )
All files within a given path (less efficient):
if( location.href.match(/^http:\/\/example\.com\/files\//) )
Exact file match:
if( location.href == 'http:\/\/example.com\/foo.html' )
Exact file match (less efficient):
if( location.href.match(/^http:\/\/example\.com\/foo\.html$/) )
Exact file match, optionally with GET variables:
if( location.href.match(/^http:\/\/example\.com\/foo\.html(\?.*)?$/) )
Exact hostname or exact subdomain:
if( location.hostname.match(/^(www\.)?example\.com$/) )
Exact hostname or any subdomain:
if( location.hostname.match(/(^|\.)example\.com$/) )
Any subdomain:
if( location.hostname.match(/\.example\.com$/) )
Exact hostname or exactly one level of subdomain:
if( location.hostname.match(/^([^\.]+\.)?example\.com$/) )
Exact subdomain of specific top level domains:
if( location.hostname.match(/^images\.google\.(com|co\.uk|com\.au|no)$/) )
Exact subdomain of most common top level domains:
if( location.hostname.match(/^images\.google\.([^\.]+|[^\.]{2,3}\.[^\.]{2})$/) )