• This repository has been archived on 09/Feb/2024
  • Stars
    star
    986
  • Rank 46,429 (Top 1.0 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 12 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Asynchronously write javascript, even with document.write.

Overview

Version License Build Status Code Climate Coverage Dependencies Commitizen friendly semantic-release Gitter jsDelivr Hits

Remote scripts, especially ads, block the page from doing anything else while they load. They contribute a large % to load times which affects your bottom line. Asynchronous ads do not block the page and can be delivered after core content - Async FTW.

Why is it so hard to deliver ads asynchronously? Because they may contain calls to document.write, which expects to be handled synchronously. PostScribe lets you deliver a synchronous ad asynchronously without modifying the ad code.

Approach

Other tag writing libraries exist (see alternatives), but PostScribe is novel in its use of what we call DOM Proxies, a way to ensure that the content is written as close to the way the browser would natively write the content with document.write/innerHTML. Read: it behaves just like the browser would, without convoluted parsing or hacks.

For more information:

Getting Started

PostScribe overrides document.write. It is best and safest to use PostScribe after DOM is ready.

Installation

Browser

If you just want to use the script without installing anything, use the following to load the script from cdnjs:

<script src="https://cdnjs.cloudflare.com/ajax/libs/postscribe/2.0.8/postscribe.min.js"></script>

NPM

You can include postscribe using npm:

npm install --save postscribe

Postscribe runs in browsers, so this assumes you're using a module bundler like webpack, Browserify, JSPM or Rollup to consume CommonJS modules.

Bower

You can include postscribe using bower by installing from the CDN URL:

bower install --save https://cdnjs.cloudflare.com/ajax/libs/postscribe/2.0.8/postscribe.min.js

The library will exist at <components_folder>/postscribe/index.js.

Accessing

ES6/ES2015

import postscribe from 'postscribe';

AMD

define(['postscribe'], function(postscribe) {

});

CommonJS

var postscribe = require('postscribe');

Usage

To append html to #mydiv:

postscribe('#mydiv', '<h1>Hello PostScribe</h1>');

In general:

postscribe(element, html, options);
  • element: a DOM Element, jQuery object, or id selector (e.g. "#mydiv")
  • html: an html string or a function that takes a DOM Document and writes to it.
  • options: a hash of options
    • afterAsync: a callback called when an async script has loaded
    • afterDequeue: a callback called immediately before removing from the write queue
    • afterStreamStart: a callback called sync after a stream's first thread release
    • afterWrite: a callback called after writing buffered document.write calls
    • done: a callback that will be called when writing is finished
    • autoFix: a boolean that allows disabling the autoFix feature of prescribe
    • beforeEnqueue: a callback called immediately before adding to the write queue
    • beforeWriteToken: a callback called before writing a token
    • beforeWrite: a callback called before writing buffered document.write calls
    • error: a function that throws the error by default, but could be overwritten
    • releaseAsync: a boolean whether to let scripts w/ async attribute set fall out of the queue

If you just want to mess around, include the js files at the top of an html page that contains the following:

<div id="mydiv"></div>
<script type="text/javascript">
  postscribe('#mydiv', '<h1>Hello PostScribe</h1>');
</script>

How to use PostScribe to render an ad after load

Where normally you would have

<div id="ad"><h5>Advertisement</h5>
  <script type="text/javascript">
    // Build url params and make the ad call
    document.write('<script src=doubleclick_url_with_params><\/script>');
  </script>
</div>

Instead, remove the ad call and close the div

<div id="ad"><h5>Advertisement</h5></div>

<script type="text/javascript">
  // jQuery used as an example of delaying until load.
  $(function() {
    // Build url params and make the ad call
    postscribe('#ad', '<script src=doubleclick_url_with_params><\/script>');
  });
</script>

There are some hooks you may pass as the third argument. For example:

<script type="text/javascript">
  // jQuery used as an example of delaying until load.
  $(function() {
    postscribe('#ad', '<script src=doubleclick_url_with_params><\/script>', {
      done: function() {
        console.info('Dblclick script has been delivered.');
      }
    });
  });
</script>

See the beginning of postscribe.js for a complete list.

FAQ

Does it work with jQuery, Prototype, Backbone, Underscore, jQuery UI, YUI, mooTools, dojo, etc.?

Yep. It neither depends on nor conflicts with any of the existing popular javascript frameworks.

Does it work with another tag writing library on the page?

No. Only one tag writer at a time.

Who is using it

This project was originally developed at Krux as part of its SuperTag product. There it has been battle tested on high-profile sites like The New York Times, The Wall Street Journal, NBCU, and hundreds of others. It is actively maintained by Krux.

Browser Compatibility

PostScribe was designed to behave as closely to the native document.write/innerHTML does as possible, and we've taken great care to make sure that it works on every browser we can get our hands on. We expect it to work on every browser built after 2009. There are over 500 unit tests that run on every commit. PostScribe is thoroughly tested and known to work well in the following browsers:

  • Firefox 4+
  • Chrome 10+
  • Safari 5.0+
  • Opera 10.0+
  • Internet Explorer 8+
  • iPhone/iPad and other WebKit-based browsers

Note that we do not provide any support for Internet Explorer versions earlier than IE8.

Alternatives

We've stood on the shoulders of giants with our work, and there are other alternative approaches to solve this problem. Shout out to the best ones we found:

If you would like your project to be added to this list, file an issue and we'd be happy to.

Help/Bugs/Requests

We β™₯ bug reports.

Have a problem? Need help? Would you like additional functionality added? We use GitHub's ticket system for keeping track of these requests.

Please check out the existing issues, and if you don't see that your problem is already being worked on, please file a new issue. The more information the better to describe your problem.

Contributing

We β™₯ forks and pull requests.

Please see CONTRIBUTING.md for full details.

Environment

The project requires nodejs (>=5.6) and npm (>=3.6.0) for development. It has no runtime dependencies.

Developing

Check the code out and install the development dependencies using:

npm install

Building

To build the code, run

npm run build

Linting

We use ESLint and JSCS to do static analysis of the JavaScript and keep things smelling good. To run both, use:

npm run lint

Testing

Using travis-ci, the unit tests are run on every commit using PhantomJS to run the tests with a real browser.

To test the code locally, you can use:

npm test

To run tests in Test-Driven-Development mode, where the test will be run after every change, use:

npm run tdd

To run the cross-browser tests, use:

npm run test:cross-browser

Issue Guidelines

Please either add a failing unit test or include a jsfiddle that distills and reproduces the issue.

Try forking this jsfiddle. We've set everything up there for you so that you can reproduce your issue.

License

We aim for you to use this inside your application, so we picked the least restrictive license we could find.

See LICENSE.

More Repositories

1

ops-tools

Internal ops tools at krux
Python
32
star
2

monitorlib

(obs python2) Python library for creating monitoring scripts/plugins.
Python
28
star
3

kafka-metrics-reporter

A custom KafkaMetricsReporter intended to be dropped into a Kafka broker cluster that will send all consumer offset metrics to a configured Graphite server.
Java
19
star
4

kafka-mirror-maker

The Krux Mirror Maker is a custom solution for easily providing message replication capabilities between Kafka broker clusters
Java
18
star
5

prescribe

Tiny HTML parser in JavaScript
JavaScript
17
star
6

tcp-stream-kafka-producer

Splits newline-delimited TCP streams into Kafka messages
Java
17
star
7

java-kafka-client-libs

The Krux Kafka Client library as a simple wrapper for the Kafka-provided client libraries, both producers and consumers
Java
12
star
8

gpt-mock

(Obsolete) Node.js mock library for Google Publisher Tags (gpt)
JavaScript
11
star
9

puppet-module-graphite-report

Puppet module for sending report data to graphite.
Ruby
10
star
10

java-stdlib

Krux's Standard Java Library
Java
7
star
11

privacy_scanner

Put in a url, we give you back privacy info
JavaScript
6
star
12

python-useragentutils

(obs python2) User agent parser
Python
5
star
13

condition-jenkins

make sure the right build(jobs) on jenkins get published
JavaScript
5
star
14

python-krux-stdlib

Standard libraries for Python development done the Krux Way
Python
4
star
15

stubborn

A Scala library for performing retries on actions that might fail.
Scala
4
star
16

python-s3proxy

Python
4
star
17

varnish-pkg

varnish build source (git-import-dsc from source debs), with krux-specific vmods added, for building in jenkins with cowbuilder.
C
2
star
18

python-kruxstatsd

Wrapper around pystatsd
Python
2
star
19

Apache2-Filter-HTTPHeadersFixup

Fixup Apache2 headers on connection (fork from http://search.cpan.org/~pgollucci/Apache2-Filter-HTTPHeadersFixup/)
Perl
2
star
20

starport

Scala
2
star
21

carbon-relay-ng

Internal fork of https://github.com/graphite-ng/carbon-relay-ng
Go
1
star
22

hiera-aws-secretsmanager

Hiera backend for AWS Secrets Manager
Ruby
1
star
23

zookeeper-pkg

Java
1
star
24

python-krux-aws-reserved-instances

(obs python2) Python library to analyze AWS reserved instances, built on top of krux-stdlib
Python
1
star
25

python-storm

(obs python2) auto-build of python-storm using thrift --gen
Python
1
star
26

python-krux-boto-s3

Library for interacting with AWS S3 built on krux-boto
Python
1
star
27

collectd

C
1
star
28

pysecurity-groups

(obs python2)
Python
1
star
29

python-krux-boto-ec2

Library for interacting with AWS EC2 built on krux-boto
Python
1
star