PageSourceSearch

https://www.swiss-athletics.ch/_assets/9936fbff2fa9683e2f00411c767…/ajax-request/lib/ajax-request.js

js swiss-athletics.ch collected 2026-09-24 09:44:20 UTC 5,072 bytes, 135 lines download raw bytes

1import {ComponentService} from 'component-service';
2
3export class AjaxRequest {
4    static before = new Event('ajaxRequest.before');
5    static errorEvent = new Event('ajaxRequest.error');
6    props = {};
7    mode = '';
8
9    constructor(props) {
10        this.props = props;
11        if (this.props['method'] === 'get') {
12            this.props['url'] = this.addBodyParametersToUrl(this.props['body'], this.props['url']);
13            delete this.props['body'];
14        }
15    }
16
17    addBodyParametersToUrl(formData, url){
18        if(!formData){
19            return url;
20        }
21        const filteredFormParameters = Array.from(formData).filter(
22            ([fieldKey, fieldvalue]) => {return fieldvalue}
23        );
24        if(filteredFormParameters.length === 0){
25            return url;
26        }
27
28        const newUrl = new URL(url);
29        filteredFormParameters.forEach(([fieldKey, fieldValue]) => {
30            newUrl.searchParams.append(fieldKey, fieldValue);
31        });
32        return newUrl.href;
33    }
34
35    async send(mode) {
36        this.mode = mode;
37        try {
38            const response = await fetch(this.props['url'], this.props);
39            this.success(response);
40            return response;
41        } catch (exception) {
42            console.error(exception);
43            console.error(this);
44            this.props['target'].dispatchEvent(AjaxRequest.errorEvent);
45        }
46    }
47
48    async success(response) {
49        const content = await this.getContent(response);
50        if (content && this.mode === 'append') {
51            this.props['target'].append(...content);
52        }
53        if (content && this.mode === 'replace') {
54            this.props['target'].replaceChildren(...content);
55        }
56        document.body.dispatchEvent(ComponentService.changeEvent);
57    }
58
59    async getContent(response) {
60        if (response.status >= 200 && response.status < 400) {
61            switch (this.props['responseType']) {
62                case 'json':
63                    if (this.props['template']) {
64                        if (this.props['responseParser']) {
65                            return await this.parseResponse(response);
66                        } else {
67                            return await this.renderTemplate(response, null);
68                        }
69                    }
70                    return await response.json();
71                case 'text':
72                    return [await response.text()];
73                case 'document':
74                    return await this.parseDocument(response);
75            }
76            return '';
77        }
78    }
79
80    async parseDocument(response) {
81        if (this.props['responseParser']) {
82            const parser = new DOMParser();
83            let text;
84
85            if (this.props['decode']) {
86                const buffer = await response.arrayBuffer();
87                const decoder = new TextDecoder(this.props['decode']);
88                text = decoder.decode(buffer);
89            } else {
90                text = await response.text();
91            }
92            const xmlDoc = parser.parseFromString(text, "application/xml");
93
94            if (xmlDoc.documentElement.nodeName === "parsererror") {
95                throw new Error("Fehler beim Parsen des XML-Dokuments");
96            } else {
97                const module = await ComponentService.loadModule(this.props['responseParser']);
98                const responsePicker = module[this.props['responseParserName']];
99                const responseData = responsePicker.initElement(this, xmlDoc)
100                return this.renderTemplate(response, responseData);
101            }
102
103        } else {
104            return await this.renderDocument(response);
105        }
106    }
107
108    async renderDocument(response) {
109        const responseDocument = document.createRange().createContextualFragment(await response.text());
110        return this.props['responseClassName'] ? responseDocument.querySelector('.' + this.props['responseClassName']).children : responseDocument.children;
111    }
112
113    async parseResponse(response) {
114        const module = await ComponentService.loadModule(this.props['responseParser']);
115        const responsePicker = module[this.props['responseParserName']];
116        const responseData = responsePicker.initElement(this,response, await response.json())
117
118        return this.renderTemplate(response, responseData)
119    }
120
121
122    async renderTemplate(response, responseData) {
123        const module = await ComponentService.loadModule('template-factory');
124        const templateFactory = module.TemplateFactory;
125        const templateName = 'js-template-' + this.props['template'];
126        let renderedTemplate;
127
128        if (responseData) {
129            renderedTemplate = templateFactory.renderTemplate(templateFactory.getTemplateById(templateName), responseData);
130        } else {
131            renderedTemplate = templateFactory.renderTemplate(templateFactory.getTemplateById(templateName), await response.json());
132        }
133        return document.createRange().createContextualFragment(renderedTemplate).children;
134    }
135}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.