iframe_single_optin
Version:
Single opt-in for iframe resources like google maps, youtube and vimeo.
188 lines (139 loc) • 8.12 kB
Markdown
# Iframe single opt-in
JavaScript and CSS-styles to get an opt-in for iframe resources like YouTube, VIMEO and Google Maps.
## Install
### github
```sh
git clone https://github.com/sunixzs/iframe_single_opt_in.git
```
or as submodule:
```sh
git init submodule
git submodule add https://github.com/sunixzs/iframe_single_opt_in.git path/to/be
```
### NPM
```sh
npm i iframe_single_optin
```
or
```sh
yarn add iframe_single_optin
```
## Add to page
Include the stylesheet located in `./dist/css/iframe-single-opt-in.css` or write your own. Of course you also may include the sources in `./src/scss`.
There are at least two ways to include the script in a webpage:
### 1. Let the script find the elements / use `data-toggle="iframe-single-opt-in"`-attribute
Include script `./dist/js/iframe-single-opt-in-init.js` in the bottom of the page and let the script find the elements by attribute `data-toggle="iframe-single-opt-in"`.
The following attributes must further be set to the element:
- `data-service`
Either 'googlemaps', 'youtube' or 'vimeo'.
- `data-iframe-markup`
The export iframe markup of the service. Either plain markup or urlencoded. In all the services you find a share button. There is an option to embed into a webpage which produces an iframe tag. Just like you want to embed without opt-in.
The following attribut is not required and defaults to `true`:
- `data-is-urlencoded`
This declares, if `iframe-markup` is urlencoded or not.
An example markup could look like this:
```html
<div
class="isoi isoi--dark isoi--ratio isoi--16by9"
data-toggle="iframe-single-opt-in"
data-service="youtube"
data-iframe-markup="%3Ciframe[...]iframe%3E"
data-is-urlencoded="true"
></div>
```
### 2. Make instances of `IframeSingleOptIn()`
Include script `./dist/js/iframe-single-opt-in.js` in the head section of the page (or just before calling `IframeSingleOptIn`). The script is bind to `window.IframeSingleOptIn`.
Example:
```html
<div class="isoi isoi--dark isoi--ratio isoi--16by9" id="isoi-example"></div>
<script>
new IframeSingleOptIn(
document.querySelector("#isoi-example"),
'youtube',
'<iframe [...]></iframe>'
false
);
</script>
```
## Interface
```js
/**
* @param {HTMLElement} container The container where the iframe should be placed in.
* @param {ServiceType} service Either 'googlemaps', 'youtube' or 'vimeo'.
* @param {string} iframeMarkup The iframe markup - urlencoded or not.
* @param {boolean} isUrlEncoded Is iframeMarkup urlencoded?
* @param {} params Additional params - see below
*/
IframeSingleOptIn(container, service, iframeMarkup, (isUrlEncoded = false), (params = {}));
```
To urlencode the iframe markup you may use https://www.urlencoder.org/ which worked for me.
## Params
| Param | Type | Default | Description |
| ---------------- | -------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `titleText` | `string` | 'External video' or 'External map' | Type relational visible title. |
| `infoText` | `string` | 'By loading this resource you agree the privacy policy of {SERVICE_NAME}.' | Type relational visible info text. |
| `serviceUrlText` | `string` | 'more information' | Visible text for the data privacy link of the service. |
| `showText` | `string` | 'show {SERVICE_NAME} video' | Type relational visible button text. |
| `serviceUrl` | `string` | 'http://[vimeo.com\|youtube.com\|maps.google.com]...' | Data privay URI of the service. |
| `cssClass` | `string` | 'isoi' | CSS-class prefix for the created elements. |
| `language` | `object` | {languageKey: { titleText:'Hey user', [...]}} | Another way to override the texts. `languageKey` will be set as current language. Have a look at `./src/ts/Language/LanguageData.default.ts` for the text keys. |
Texts for english and german are built in. Use `params.*Text` to override some of them. The language will be determined by reading the `lang`-attribute of the `html`-tag (`de` for german and others for english).
There is another way to override a complete language set by using `params.language`. There is an example at the end of this page.
## Build in CSS
Set `class="isoi"` to the container. `isoi` creates the basic structure.
You could add one of the following classes as 'theme':
- `isoi--dark` for a dark UI.
- `isoi--light` for a light UI.
If you would like to set a predefined ratio, add these classes:
- `isoi--ratio isoi--ratio-16by9`
- `isoi--ratio isoi--ratio-3by2`
- `isoi--ratio isoi--ratio-4by3`
- `isoi--ratio isoi--ratio-1by1`
A complete set could be:
```html
<div class="isoi isoi--dark isoi--ratio isoi--16by9"></div>
```
## Examples
There are some examples in <a href="./dist/example.data-attribute.html">./dist/example.data-attribute.html</a>, <a href="./dist/example.instance.html">./dist/example.instance.html</a> and <a href="./dist/example.override-language.html">./dist/example.override-language.html</a>.
### Another service
The `service` parameter is only used to automatically use the build in texts. If you want to use another service, override the texts, but use one of the service names:
```html
<div class="isoi isoi--dark isoi--ratio isoi--16by9" id="isoi-another-service"></div>
<script>
new IframeSingleOptIn(
document.querySelector("#isoi-another-service"),
'vimeo',
'<iframe src="https://another-one-bites-the.dust" [...]></iframe>'
false,
{
titleText: 'Queen: Another one bites the dust',
infoText: 'Maybe Queen makes you emotional, so we have to warn you before you load the stuff ;-)',
serviceUrlText: '',
showText: 'Let\'s rock'
}
);
</script>
```
Here is another example using the `language` parameter. Supported markers are `{SERVICE_NAME}` and `{SERVICE_URL}`
```html
<div class="isoi isoi--dark isoi--ratio isoi--16by9" id="isoi-another-language"></div>
<script>
let languageDeDu = {
titleTextMap: "Wir benötigen Deine Zustimmung für {SERVICE_NAME}",
serviceUrlText: "Datenschutzerklärung: {SERVICE_URL}",
showTextMap: "Zeig mir die Karte!",
infoTextMap: "Wir verwenden {SERVICE_NAME}. Ein Drittanbieter, um Karteninhalte einzubetten. Dieser Service kann Daten zu Deinen Aktivitäten sammeln. Bitte lese die Details durch und stimme der Nutzung zu, um die Karte anzuzeigen."
};
new IframeSingleOptIn(
document.querySelector("#isoi-another-language"),
"googlemaps",
`%3Ciframe[...]iframe%3E`,
true,
{
language: {
deDu: languageDeDu
}
}
);
</script>
```